2016-02-27 60 views
0
SELECT team_with.participant1,team_with.participant2,team_with.participant3 
FROM event,team_with 
WHERE team_with.for_event_no=event.event_no AND 
event.event_no=4 AND 
team_with.participant1=9 OR 
team_with.participant2=9 OR 
team_with.participant3=9; 

我寫了特定的查詢,並在一行中獲得了所需的ID。我無法修改這個查詢,以便代替這些id,顯示連接到id的名字。使用單個查詢替換ID的名稱使用單個查詢

student_detatil表由PK(sam_id)和屬性name組成。

當前查詢顯示的ID是連接到student_detail.sam_id.的FK。

+1

查看正常化。沒有其他解決方案值得考慮 – Strawberry

+0

好的,我會嘗試。 – klbm9999

+1

@Strawberry如果可能的話,這將是一個更好的解決方案。 – jpw

回答

0

這似乎是一個糟糕的設計,以繁殖存儲不同參與者的列。考慮爲每個參與者創建一個單獨的行並將它們存儲在一個表中。你的加入邏輯也會更容易。

此外,請使用明確的JOIN語法 - 通過將連接邏輯與數據檢索條件分開,使查詢更加清晰易懂。

請記住,運營商AND優先於OR,因此您的event.event_no = 4不適用於每個參與者條件。我相信這是一個錯誤,但你是一個判斷的人。

對於查詢本身,您可以將OR條件應用到連接中,或者只需加入student_detail表三次。

SELECT 
    s1.name, 
    s2.name, 
    s3.name 
FROM 
    event e 
    INNER JOIN team_with t ON t.for_event_no = e.event_no 
    LEFT JOIN student_detail s1 ON s1.sam_id = t.participant1 
    LEFT JOIN student_detail s2 ON s2.sam_id = t.participant2 
    LEFT JOIN student_detail s3 ON s3.sam_id = t.participant3 
WHERE 
    e.event_no = 4 
    AND (t.participant1=9 OR t.participant2=9 OR t.participant3=9); 
+0

謝謝。這工作。關於設計,每個事件有不同數量的參與者,但並不總是3.因此,我爲團隊成員存儲了不同的列。你能提出更好的建議嗎? – klbm9999

+0

您應該爲事件中的參與者提供表格,並將該列存儲爲外鍵以指向您的表格。通過這種方式,不同數量的參與者不會將您的列與事件 –

+0

相乘。但是在這種情況下,表的數量將等於事件的數量。擁有如此多數量的表格是否是一個好設計? (我有32個不同的事件) – klbm9999