繁体   English   中英

SQL GROUP BY / COUNT即使没有结果

[英]SQL GROUP BY/COUNT even if no results

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

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

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

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

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

请注意,与某些数据库品牌不同,MySQL允许您在选择列表中列出许多列,即使您只将GROUP BY作为其主键也是如此。 只要select-list中的列在功能上依赖于GROUP BY列,结果就是明确的。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM