当我的左加入声明时,任何人都可以帮助我吗?我认为 mySQL 引擎坏了

Can anyone help me when my left join statement? I think the mySQL Engine is broken

目前我正在尝试通过查询 Start_Periods 的列表输出到一个名为 Payslip 的 table .这只是一个简单的查询,我正在测试它,然后再将它变成复杂的东西。但是在这个非常简单的层面上,mySql 引擎显示我的数据的方式似乎有问题。

我当前的查询是

   SELECT a.SPERIOD
    FROM Payslip a
    LEFT JOIN Earndetl b ON a.SPERIOD = b.SPERIOD
    LEFT JOIN Ded_detl c ON a.SPERIOD = c.SPERIOD
    WHERE MONTH(a.SPERIOD) = 1
    AND MONTH(b.SPERIOD) = 1
    AND MONTH(c.SPERIOD) = 1
    GROUP BY a.SPERIOD;

输出:

SPERIOD
2015-01-01
2015-01-16

同时查询如下:

SELECT SPERIOD FROM Payslip WHERE MONTH(SPERIOD) = 1 GROUP BY SPERIOD;

输出:

SPERIOD
2015-01-01
2015-01-02
2015-01-16
2015-01-18

因为我只使用 Left Join 到 EarnDetl 和 Ded_detl,不管是否有相同的 SPERIOD两个 table,这应该不是问题吧?还是我的查询有问题,我在过去一小时内没有看到?

LEFT JOIN 时,将右侧 table 的条件放在 ON 子句中以获得真正的左连接行为! (当在 WHERE 时,您会得到常规的内部联接结果):

SELECT a.SPERIOD
FROM Payslip a
LEFT JOIN Earndetl b ON a.SPERIOD = b.SPERIOD AND MONTH(b.SPERIOD) = 1
LEFT JOIN Ded_detl c ON a.SPERIOD = c.SPERIOD AND MONTH(c.SPERIOD) = 1
WHERE MONTH(a.SPERIOD) = 1
GROUP BY a.SPERIOD;

如果除了 a.SPERIOD 之外,您不打算 select 其他任何事情,您可以删除 GROUP BY 而改为 SELECT DISTINCT.

我想用 with 子句来做这件事只是为了好玩。

WITH
A as (
    SELECT * FROM Payslip WHERE MONTH(SPERIOD) = 1
),
B as (
    SELECT * FROM Earndetl WHERE MONTH(SPERIOD) = 1
),
C as (
    SELECT * FROM Ded_detl WHERE MONTH(SPERIOD) = 1
)

SELECT a.SPERIOD
FROM A
LEFT JOIN B ON A.SPERIOD = B.SPERIOD
LEFT JOIN C ON A.SPERIOD = C.SPERIOD
GROUP BY a.SPERIOD;