我试图从一个表(游戏)中获取信息,并计算与第一个表中的每个条目对应的另一个表(票证)中的条目。我希望返回第一个表中的每个条目,即使第二个表中没有任何条目。我的查询如下:
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;
我做错了什么?
答案 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
。