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
相关产品推荐
相关产品推荐

