You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL中基于首查询结果关联实现员工缺勤统计的SQL查询方案咨询

解决MySQL关联查询员工信息与缺勤次数的问题

嘿,这个需求其实用内连接(INNER JOIN)、子查询甚至**左连接(LEFT JOIN)**都能实现,不过不同方案适用的场景略有区别,我给你逐个拆解:

方案1:内连接+分组统计(仅显示有缺勤记录的员工)

如果你的需求只是展示有过缺勤记录的alpha团队员工,用内连接结合分组统计是最直观的写法:

SELECT 
    e.id_number,
    e.name,
    e.surname,
    COUNT(el.attendance_type) AS no_show_count
FROM employee e
INNER JOIN employee_log el 
    ON e.id_number = el.id_number
WHERE e.team_name = "alpha"
    AND el.attendance_type = "No-Show"
GROUP BY e.id_number, e.name, e.surname;

这里通过id_number把员工表和出勤日志表关联,过滤出alpha团队和"未到岗"的记录,再按员工维度分组,统计每个员工的缺勤次数。

⚠️ 注意:这个方案会漏掉从未缺勤的alpha员工,因为内连接只返回两张表都有匹配数据的记录。

方案2:左连接+分组统计(显示所有alpha团队员工)

如果需要展示所有alpha团队员工,哪怕是从来没缺勤过的(缺勤次数显示0),左连接是更合适的选择:

SELECT 
    e.id_number,
    e.name,
    e.surname,
    COUNT(el.attendance_type) AS no_show_count
FROM employee e
LEFT JOIN employee_log el 
    ON e.id_number = el.id_number
    AND el.attendance_type = "No-Show" -- 把出勤状态条件放在JOIN的ON子句里
WHERE e.team_name = "alpha"
GROUP BY e.id_number, e.name, e.surname;

左连接会保留员工表中所有匹配"alpha"团队的记录,哪怕该员工没有对应的缺勤日志,此时COUNT(el.attendance_type)会返回0,完美覆盖所有员工的需求。

方案3:子查询(逻辑更贴近你的原始查询思路)

如果你更倾向于保留原来两个独立查询的逻辑,把缺勤统计作为子查询嵌入主查询也是个不错的选择:

SELECT 
    e.id_number,
    e.name,
    e.surname,
    (SELECT COUNT(*) 
     FROM employee_log el 
     WHERE el.id_number = e.id_number 
       AND el.attendance_type = "No-Show") AS no_show_count
FROM employee e
WHERE e.team_name = "alpha";

这个写法的逻辑很直白:先查出所有alpha团队的员工,再对每个员工单独查询他的缺勤次数,同样会显示所有员工,没缺勤的显示0,而且不需要额外分组,代码结构更简洁。

方案选择建议

  • 只需要有缺勤记录的员工:选内连接方案
  • 需要所有alpha团队员工:左连接或子查询都可以,数据量较大时左连接的性能可能更优(前提是id_number和attendance_type字段有合适的索引)

内容的提问来源于stack exchange,提问作者Tyranus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 17:03:15