MySQL LEFT JOIN SELECT不选择所有左侧记录?
题
我从包含 LEFT JOIN
的 MySQL SELECT
查询得到奇怪的结果,我无法理解我对 LEFT JOIN的理解代码>是错误的,或者我是否看到了一种真正奇怪的行为。
我有两个具有多对一关系的表:对于 table 1
中的每条记录, table 2
中有0条或更多条记录。我想选择表1中的所有记录,其中的列计算表2中相关记录的数量。据我所知, LEFT JOIN
应始终返回 LEFT <上的所有记录/ code>声明的一面。
这是一个展示问题的测试数据库:
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);
日期表有三条记录,而插槽1 - 该记录指向日期中的第三条记录。
如果我执行以下查询..
SELECT d.date, count(s.slotID) FROM Dates AS d LEFT JOIN Slots AS s ON s.dateID=d.dateID GROUP BY s.dateID;
..我希望看到一个包含3行的表 - 两个计数为0,另一个计数为1.但我实际看到的是:
+------------+-----------------+
| date | count(s.slotID) |
+------------+-----------------+
| 2008-10-12 | 0 |
| 2008-10-14 | 1 |
+------------+-----------------+
显示零计数的第一个记录,但忽略后计数为零的记录。
我做错了什么,或者我只是不明白LEFT JOIN应该做什么?
解决方案
您需要 GROUP BY d.dateID
。在您的两种情况下, s.DateID
是 NULL
( LEFT JOIN
),它们组合在一起。
我认为你也会发现这是无效的(ANSI)SQL,因为d.date不是 GROUP BY
的一部分或聚合操作的结果,并且不应该能够是 SELECT
ed。
其他提示
我认为你的意思是按照d.dateId进行分组。
尝试删除GROUP BY s.dateID
10-12和10-13的日期由您组合在一起。由于它们是2个空值,因此计数计算为0
我不知道这在MySQL中是否有效,但您可能会在将来使用以下语法取消此错误
SELECT date, count(slotID) as slotCount
FROM Dates LEFT OUTER JOIN Slots USING (dateID)
GROUP BY (date)
通过使用USING子句,您无法获得两个dateID来跟踪。
用d.dateID替换GROUP BY s.dateID。
不隶属于 StackOverflow