我从包含 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。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top