我从一个MySQL SELECT
涉及a 的查询得到了奇怪的结果LEFT JOIN
,我无法理解我的理解LEFT JOIN
是错误的还是我看到了一个真正奇怪的行为.
我有两个表有多对一关系的表:对于每个记录中table 1
有0个或更多记录table 2
.我想选择表1中的所有记录,其中的列计算表2中相关记录的数量.据我所知,LEFT JOIN
应始终返回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);
日期表有三个记录,插槽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
编辑.