2008-12-23 104 views
2

我試圖從一個表(遊戲)中獲取信息並計算與第一個表中的每個條目對應的另一個表(票證)中的條目。即使第二個表中沒有任何條目,我也希望返回第一個表中的每個條目。我的查詢如下:SQL GROUP BY/COUNT即使沒有結果

SELECT g.*, count(*) 
FROM games g, tickets t 
WHERE (t.game_number = g.game_number 
    OR NOT EXISTS (SELECT * FROM tickets t2 WHERE t2.game_number=g.game_number)) 
GROUP BY t.game_number; 

我在做什麼錯?

回答

5

你需要做一個左聯接:

SELECT g.Game_Number, g.PutColumnsHere, count(t.Game_Number) 
FROM games g 
LEFT JOIN tickets t ON g.Game_Number = t.Game_Number 
GROUP BY g.Game_Number, g.PutColumnsHere 

另外,我覺得這是一個相關子查詢更清楚一點:

SELECT g.Game_Number, G.PutColumnsHere, 
    (SELECT COUNT(*) FROM Tickets T WHERE t.Game_Number = g.Game_Number) Tickets_Count 
FROM Games g 

只要確保你檢查查詢計劃確認優化器很好地解釋了這一點。

+0

非常感謝 - 我有點尷尬,我不知道這應該是一個左連接。 – Wickethewok 2008-12-23 18:16:42

+0

不要 - sql是不可靠的。 – 2008-12-23 18:18:15

1

FROM games g, tickets t」是問題行。這執行一個內部連接。任何where子句不能添加到此。我想你想要一個LEFT OUTER JOIN

2

您需要了解更多有關如何使用連接在SQL:

SELECT g.*, count(*) 
FROM games g 
LEFT OUTER JOIN tickets t 
USING (game_number) 
GROUP BY g.game_number; 

注意,不像某些數據庫品牌中,MySQL允許你即使列出在選擇列表中的列只GROUP BY他們首要的關鍵。只要您的選擇列表中的列是功能依賴 GROUP BY列,結果是明確的。

其他品牌的數據庫(Microsoft,Firebird等)如果列出選擇列表中的任何列而不將它們包含在GROUP BY或集合函數中,則會給您一個錯誤。