mysql - 当我的左连接声明时,有人可以帮助我吗?我认为 mySQL 引擎已损坏

标签 mysql sql sqlyog

目前,我正在尝试通过查询输出名为 Payslip 的表中的 Start_Periods 列表。这只是一个简单的查询,我在将其变成复杂的查询之前正在测试它。但在这个非常简单的层面上,mySql Engine 显示数据的方式似乎有问题。

我当前的查询是

   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,这应该不是问题,对吧?或者我的查询是否有问题,我在过去一小时内没有看到?

最佳答案

LEFT JOIN时,将右侧表的条件放在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 之外的任何其他内容,则可以删除 GROUP BY 并改为 SELECT DISTINCT

关于mysql - 当我的左连接声明时,有人可以帮助我吗?我认为 mySQL 引擎已损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36791867/

相关文章:

php - 将分配的有序号添加到数组条目 php

java - 删除一行后我希望主键再次从1开始,请问有可能吗

sql - Sql Server 2016 中 INSERT SELECT UNION ALL 的原子性

sql - 在插入触发器上从表 1 插入到表 2

php - MySQL 2003 错误 : can't connect to localhost (10061), 但 PHPMyAdmin 可以工作

mysql - SQL查询自动输入日期变量

c# - 通过C#在sql中插入数据

sql - Postgresql:使用 Join 将多个几何合并为单个几何

mysql - 选择每个组中的倒数第二条记录

Php PDO,类方法返回真而参数中的列名错误?