【问题标题】:MySQL LEFT JOIN SELECT not selecting all the left side records?MySQL LEFT JOIN SELECT 没有选择所有左侧记录?
【发布时间】:2010-09-17 08:20:42
【问题描述】:

我从涉及LEFT JOINMySQL SELECT 查询中得到奇怪的结果,我不明白我对LEFT JOIN 的理解是否错误,或者我看到的行为是否真的很奇怪。

我有两个具有多对一关系的表:对于table 1 中的每条记录,table 2 中有 0 条或更多条记录。我想选择表 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 应该做什么?

【问题讨论】:

    标签: sql mysql join


    【解决方案1】:

    我不知道这在 MySQL 中是否有效,但您将来可能会通过使用以下语法来避免此错误

    SELECT date, count(slotID) as slotCount
    FROM Dates LEFT OUTER JOIN Slots USING (dateID)
    GROUP BY (date)
    

    通过使用 USING 子句,您不需要跟踪两个 dateID。

    【讨论】:

    • 它在 MySQL 中工作(刚刚测试过,它给出了与其他答案相同的正确结果)。
    【解决方案2】:

    您需要GROUP BY d.dateID。在您的两种情况下,s.DateIDNULL (LEFT JOIN),它们组合在一起。

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

    【讨论】:

      【解决方案3】:

      将 GROUP BY s.dateID 替换为 d.dateID。

      【讨论】:

        【解决方案4】:

        10-12 和 10-13 的 dateid 由您组合在一起。由于它们是 2 个空值,因此计数被评估为 0

        【讨论】:

          【解决方案5】:

          尝试删除 GROUP BY s.dateID

          【讨论】:

            【解决方案6】:

            我认为您的意思是按 d.dateId 分组。

            【讨论】:

              猜你喜欢
              • 2014-11-12
              • 2018-04-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-05-07
              • 1970-01-01
              • 1970-01-01
              • 2011-11-21
              相关资源
              最近更新 更多