当我的左join语句出现时,有人能帮我吗?我想mySQL引擎坏了

当我的左join语句出现时,有人能帮我吗?我想mySQL引擎坏了,mysql,sql,sqlyog,Mysql,Sql,Sqlyog,目前,我正试图通过查询名为工资条的表中的开始时段列表来输出。这只是一个简单的查询,在将其转换为复杂的东西之前,我正在测试它。但在这个非常简单的级别上,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 WHER

目前,我正试图通过查询名为工资条的表中的开始时段列表来输出。这只是一个简单的查询,在将其转换为复杂的东西之前,我正在测试它。但在这个非常简单的级别上,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

因为我只使用左连接到EarnDetl和dedudetl,不管两个表中是否有相同的SPERIOD,这应该不是问题吧?或者我的查询有什么问题,在过去的一个小时里我没有看到?

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


如果您不打算选择除a.SPERIOD之外的任何内容,您可以删除
GROUP BY
,而是使用
select DISTINCT

思想id使用
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;

也许一点解释都不会出错。@jarlh谢谢你的回答,那么这是否意味着当我离开join时,所有联接表筛选器都不应该放在WHERE语句中?@AkiraHora查询首先执行WHERE,然后执行join。SQL就是这样工作的,它先过滤数据,然后加入数据。@AkiraHora,正确!请将工资单的状态保留在WHERE中,并将其余的放在ON条款中。@jarlh谢谢。我对此很满意。这实际上很有趣,有点离题,我创建这个查询是为了将它放在Jasper reports上,我想知道,尽管有多个语句,我是否可以使用这个查询。事实上,刚刚注意到您使用的是MySQL。不确定它是否支持。SQL是如此有趣,你可以在很多方面实现它!(例如,左连接可以通过与不存在的联合的内部连接来完成。)@AkiraHora我找不到关于它是否支持with子句的任何信息。你可以试试看。@CathalMF谢谢你的主意。我会自己做这方面的研究
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;