繁体   English   中英

与表左联接两次以获取单独的记录

[英]LEFT JOIN with a table twice to get separate records

我试图通过左加入得到全体员工的缺席,目前天的总次数employees与表attendance_chart包含在存在的记录表attendance_status

SELECT
    e.id AS employee_id,
    COUNT(present_days_chart.id) as present_days_count,
    COUNT(absent_days_chart.id) as absent_days_count

FROM
    employees e
    LEFT JOIN attendance_chart present_days_chart ON e.id = present_days_chart.attendance_for_employee_id AND present_days_chart.attendance_status = 'present'
    LEFT JOIN attendance_chart absent_days_chart ON e.id = absent_days_chart.attendance_for_employee_id AND absent_days_chart.attendance_status = 'absent'

WHERE
    e.id IN (106,138)

GROUP BY
    e.id

但是,查询会在每行的present_days_count和absent_days_count列中始终向我返回相同数量的记录。

我究竟做错了什么 ?

尝试使用CASE WHENSUM

SELECT e.id,
       SUM(CASE WHEN days_chart.attendance_status = 'present' THEN 1 ELSE 0 END) AS present_days_count , 
       SUM(CASE WHEN days_chart.attendance_status = 'absent' THEN 1 ELSE 0 END) AS absent_days_count

FROM employees e
LEFT JOIN attendance_chart days_chart ON e.id = days_chart.attendance_for_employee_id
WHERE e.id in (106,138)
GROUP BY e.id

使用此SUM + CASE WHEN结构,它应该对具有特定attendance_status每条记录进行计数,最后借助SUMGROUP BY汇总所有计数

您是否尝试过以其他方式重写它?

    SELECT
    e.id AS employee_id,
    COUNT(present_days_chart.id) as present_days_count,
    COUNT(absent_days_chart.id) as absent_days_count

FROM
    employees e
    LEFT JOIN (SELECT * FROM attendance_chart WHERE attendance_status = 'present') AS present_days_chart ON e.id = present_days_chart.attendance_for_employee_id
    LEFT JOIN (SELECT * FROM attendance_chart WHERE attendance_status = 'absent') AS absent_days_chart ON e.id = absent_days_chart.attendance_for_employee_id

WHERE
    e.id IN (106,138)

GROUP BY
    e.id

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM