MySQL LEFT JOIN SELECT不选择所有左侧记录?

时间:2008-10-15 16:09:42

标签: sql mysql join

我的MySQL SELECT查询涉及LEFT JOIN的结果很奇怪,而我无法理解我对LEFT JOIN的理解是否错误,或者我是否真的看到了table 1奇怪的行为。

我有两个表具有多对一关系:对于table 2中的每个记录,LEFT JOIN中有0个或更多记录。我想选择表1中的所有记录,其中的列计算表2中相关记录的数量。据我了解,LEFT应始终返回语句CREATE DATABASE Test; USE Test; CREATE TABLE Dates ( dateID INT UNSIGNED NOT NULL AUTO_INCREMENT, date DATE NOT NULL, UNIQUE KEY (dateID) ) TYPE=MyISAM; CREATE TABLE Slots ( slotID INT UNSIGNED NOT NULL AUTO_INCREMENT, dateID INT UNSIGNED NOT NULL, UNIQUE KEY (slotID) ) TYPE=MyISAM; INSERT INTO Dates (date) VALUES ('2008-10-12'),('2008-10-13'),('2008-10-14'); INSERT INTO Slots (dateID) VALUES (3); 侧的所有记录

这是一个展示问题的测试数据库:

SELECT d.date, count(s.slotID) FROM Dates AS d LEFT JOIN Slots AS s ON s.dateID=d.dateID GROUP BY s.dateID;

日期表有三条记录,而插槽1 - 该记录指向日期中的第三条记录。

如果我执行以下查询..

+------------+-----------------+
| date       | count(s.slotID) |
+------------+-----------------+
| 2008-10-12 |               0 |
| 2008-10-14 |               1 |
+------------+-----------------+

..我希望看到一个包含3行的表 - 两个计数为0,另一个计数为1.但我实际看到的是:

{{1}}

显示零计数的第一个记录,但忽略后计数为零的记录。

我做错了什么,或者我只是不明白LEFT JOIN应该做什么?

6 个答案:

答案 0 :(得分:6)

您需要GROUP BY d.dateID。在您的两个案例中,s.DateIDNULLLEFT JOIN),这些组合在一起。

我认为您还会发现这是无效的(ANSI)SQL,因为d.date不是GROUP BY的一部分或聚合操作的结果,并且不应该是{{1 }}编

答案 1 :(得分:2)

我认为你的意思是按照d.dateId进行分组。

答案 2 :(得分:1)

尝试删除GROUP BY s.dateID

答案 3 :(得分:1)

10-12和10-13的日期由您组合在一起。由于它们是2个空值,因此计数计算为0

答案 4 :(得分:1)

我不知道这在MySQL中是否有效,但您可能会在以后通过使用以下语法来取消此错误

SELECT date, count(slotID) as slotCount
FROM Dates LEFT OUTER JOIN Slots USING (dateID)
GROUP BY (date)

通过使用USING子句,您无法获得两个dateID来跟踪。

答案 5 :(得分:0)

用d.dateID替换GROUP BY s.dateID。