当前位置:  开发笔记 > 后端 > 正文

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

如何解决《MySQLLEFTJOINSELECT不选择所有左侧记录?》经验,为你挑选了1个好方法。

我从一个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应该做什么?



1> Cade Roux..:

你需要GROUP BY d.dateID.在你的两个案例中,s.DateIDNULL(LEFT JOIN)并将它们组合在一起.

我想你也会发现这是无效的(ANSI)SQL,因为d.date不是GROUP BY聚合操作的一部分或结果,不应该被SELECT编辑.

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有