繁体   English   中英

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

[英]MySQL LEFT JOIN SELECT not selecting all the left side records?

我从涉及LEFT JOINMySQL 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.DateIDNULLLEFT 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM