SQL GROUP BY/COUNT,即使没有结果

SQL GROUP BY/COUNT,即使没有结果,sql,mysql,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)) G

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

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;

我做错了什么?

您需要执行左连接:

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

只需确保您检查了查询计划,以确认优化器对此进行了很好的解释。

“游戏g中的
,门票t
”是问题所在。这将执行内部联接。任何where子句都不能附加到这个上。我认为您需要一个
左外部联接

您需要了解有关如何在SQL中使用联接的更多信息:

SELECT g.*, count(*) 
FROM games g
 LEFT OUTER JOIN tickets t 
 USING (game_number)
GROUP BY g.game_number;
请注意,与某些数据库品牌不同,MySQL允许您在选择列表中列出许多列,即使您仅按它们的主键分组。只要选择列表中的列在功能上依赖于GROUPBY列,结果就不会有歧义


其他品牌的数据库(Microsoft、Firebird等)如果在“选择”列表中列出任何列,而不将它们包含在“分组依据”或聚合函数中,则会显示错误。

请参阅Michael的回答。(哎哟,差了21秒。)逗号语法实际上执行的是笛卡尔连接,而不是内部连接。内部连接基本上是带有限制的笛卡尔连接(ON子句上的
)非常感谢-我有点不好意思,我没有意识到这应该是一个左连接。对于一个非面向集合的思考者来说,子查询可能看起来更清晰,但这两种方法之间可能存在一些严重的性能差异。我不是MySQL专家,所以我不确定,但我至少会在做决定之前尝试一下这两种方法。@Tom:我同意你的看法。在某些情况下,SQL Server优化器将通过group by将其转换为更高效的左连接。不过,正如您所说,您必须检查查询计划,以确保它们的性能良好。