SQL/MySQL新手求助:基于自关联外键统计主管下属员工数
解决自关联员工表的主管下属统计问题
嘿,作为SQL新手碰到这种自关联的查询完全不用慌,我来给你拆解一下怎么实现需求~
核心思路
咱们的employees表是自关联结构——主管本身也是员工,所以我们需要把表和自己做连接:
- 把其中一份表看作主管表(别名
m,代表manager) - 另一份看作下属表(别名
e,代表employee) - 关联条件是下属的
super_id等于主管的emp_id - 最后按主管分组,统计每组下属的数量
完整SQL语句
SELECT m.first_name, m.last_name, COUNT(e.emp_id) AS employee_count FROM employees m LEFT JOIN employees e ON m.emp_id = e.super_id -- 如果你只想统计没有上级的顶级主管,就保留下面的WHERE条件;如果要所有有下属的主管(包括中层),可以删掉 WHERE m.super_id IS NULL GROUP BY m.emp_id, m.first_name, m.last_name ORDER BY employee_count DESC;
代码逐行解释
LEFT JOIN:用左连接是为了保证即使主管没有下属也会出现在结果里(这时候统计数为0);如果用INNER JOIN,没下属的主管会被过滤掉,你可以根据需求选择。COUNT(e.emp_id):只统计下属表中存在的员工ID(NULL会被忽略),所以能准确得到该主管的下属数量。WHERE m.super_id IS NULL:这个是可选的筛选条件——如果你的业务里顶级主管的super_id是空值,加上它就能只统计顶级主管;如果需要包含所有有下属的中层主管,直接去掉即可。GROUP BY m.emp_id, m.first_name, m.last_name:因为MySQL 5.7+默认开启ONLY_FULL_GROUP_BY模式,要求GROUP BY必须包含所有非聚合的字段;同时加emp_id是为了避免同名主管被错误合并(比如两个叫David Wallace的员工,ID不同就是不同主管)。ORDER BY employee_count DESC:按下属数量从多到少排序,方便查看。
示例结果匹配
运行这个SQL后,就能得到你想要的类似结果:
| first_name | last_name | employee_count |
|---|---|---|
| David | Wallace | 3 |
| Michael | Scott | 3 |
| Josh | Porter | 2 |
内容的提问来源于stack exchange,提问作者TechLearner
相关产品推荐
相关产品推荐

