【问题标题】:MySQL join include data also when it doesn't exist in another table当另一个表中不存在时,MySQL 连接也包括数据
【发布时间】:2016-03-31 21:34:25
【问题描述】:

我在数据库中有两个表:员工和员工假期。 employees 表只有一列员工姓名,员工假期有两列,一列包含员工姓名,另一列包含他们休假的日期。我有一个查询返回(正确)员工姓名出现在假期表中的次数,但我试图找出一种方法来返回员工姓名的条目 | 0 表示员工姓名存在于员工表中但不存在于employee_vacation 表中的情况。有没有办法可以修改这个查询来做到这一点?查询如下

select e.EMPLOYEE_NAME, COUNT(v.VACATION_DAY) AS VACATION_DAYS
from EMPLOYEE_VACATION as v
LEFT JOIN EMPLOYEES AS e USING(EMPLOYEE_NAME)
GROUP BY e.EMPLOYEE_NAME 

【问题讨论】:

    标签: mysql join


    【解决方案1】:

    你做的几乎是正确的。即使在employee_vacation 表中没有任何行的情况下,要返回员工,您实际上需要切换您的加入,以便从包含所有员工的表EMPLOYEES 和关于他们的假期信息的LEFT JOIN 开始:

    SELECT e.EMPLOYEE_NAME, COUNT(v.VACATION_DAY) AS VACATION_DAYS
    FROM EMPLOYEES e
    LEFT JOIN EMPLOYEE_VACATION v USING (EMPLOYEE_NAME)
    GROUP BY e.EMPLOYEE_NAME 
    

    或者干脆改用RIGHT JOIN(如果你很懒,可以限制代码更改):

    SELECT e.EMPLOYEE_NAME, COUNT(v.VACATION_DAY) AS VACATION_DAYS
    FROM EMPLOYEE_VACATION v
    RIGHT JOIN EMPLOYEES e USING (EMPLOYEE_NAME)
    GROUP BY e.EMPLOYEE_NAME 
    

    我更喜欢使用 LEFT 而不是 RIGHT 连接,因为我正在从上到下阅读查询,这对我来说似乎更合乎逻辑,在尝试理解逻辑时不要倒退。

    【讨论】:

    • 谢谢!实际上,我在尝试发布后不久就想通了,我应该在发布之前花更多时间在上面:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    • 2020-02-09
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    相关资源
    最近更新 更多