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

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_namelast_nameemployee_count
DavidWallace3
MichaelScott3
JoshPorter2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 06:47:37