[英]MySQL LEFT JOIN SELECT not selecting all the left side records?
我从涉及LEFT JOIN
的MySQL SELECT
查询中得到奇怪的结果,并且我不明白我对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);
Dates表具有三个记录,Slots 1-和该记录指向Dates中的第三个记录。
如果我执行以下查询。
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
。
我认为您的意思是按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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.