2008-12-23 102 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或集合函数中,则会给您一个错误。