SQL GROUP BY / COUNT即使没有结果

时间:2008-12-23 17:51:31

标签: sql mysql

我试图从一个表(游戏)中获取信息,并计算与第一个表中的每个条目对应的另一个表(票证)中的条目。我希望返回第一个表中的每个条目,即使第二个表中没有任何条目。我的查询如下:

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;

我做错了什么?

3 个答案:

答案 0 :(得分: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

请确保检查查询计划以确认优化程序能够很好地解释这一点。

答案 1 :(得分: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列上功能相关,结果就是明确的。

如果列出选择列表中的任何列而不将它们包括在GROUP BY或聚合函数中,则其他品牌的数据库(Microsoft,Firebird等)会给您一个错误。

答案 2 :(得分:1)

FROM games g, tickets t”是问题。这执行内部联接。任何where子句都不能添加到此。我想你想要LEFT OUTER JOIN