如何计算员工层级结构中顶级管理者的下属总人数?
解决方案:统计顶级管理者的下属总数
递归CTE实现(推荐)
对于树形层级的员工关系,递归CTE(Common Table Expression)是最直观且符合ANSI标准的实现方式,适用于MySQL 8.0+、PostgreSQL、SQL Server等主流数据库:
WITH RECURSIVE employee_hierarchy AS ( -- 锚点成员:筛选所有顶级管理者 SELECT id AS top_manager_id, name AS top_manager_name, id AS employee_id FROM employees WHERE managerId IS NULL UNION ALL -- 递归成员:逐层获取所有下属 SELECT eh.top_manager_id, eh.top_manager_name, e.id AS employee_id FROM employee_hierarchy eh JOIN employees e ON e.managerId = eh.employee_id ) SELECT top_manager_id AS id, top_manager_name AS name, COUNT(employee_id) - 1 AS `number of employees` FROM employee_hierarchy GROUP BY top_manager_id, top_manager_name ORDER BY top_manager_id;
代码说明
- 锚点成员:先选出所有
managerId为NULL的顶级管理者,同时记录他们的ID、姓名,并将自身ID作为初始的员工ID(后续递归会基于此拓展下属)。 - 递归成员:通过关联当前层级的
employee_id与下一层员工的managerId,不断遍历所有下属节点,直到没有更多下属为止。 - 统计逻辑:
COUNT(employee_id) - 1是因为锚点成员包含了管理者自身,减去1后得到的就是纯下属的数量。
其他可选方案
预计算层级字段
如果你的数据集非常庞大且层级结构相对稳定,可以在表中新增一个top_manager_id字段,每次新增/更新员工时,通过触发器或应用层逻辑直接维护该字段(记录员工所属的顶级管理者ID)。之后统计时只需简单分组:
SELECT e.id, e.name, COUNT(sub.id) AS `number of employees` FROM employees e LEFT JOIN employees sub ON sub.top_manager_id = e.id WHERE e.managerId IS NULL GROUP BY e.id, e.name ORDER BY e.id;
这种方式查询效率极高,但需要额外的维护成本,适合数据变更不频繁的场景。
数据库特定语法
部分数据库支持专属的层级查询语法,比如Oracle的CONNECT BY:
SELECT top_manager_id AS id, top_manager_name AS name, COUNT(employee_id) - 1 AS `number of employees` FROM ( SELECT CONNECT_BY_ROOT id AS top_manager_id, CONNECT_BY_ROOT name AS top_manager_name, id AS employee_id FROM employees START WITH managerId IS NULL CONNECT BY PRIOR id = managerId ) GROUP BY top_manager_id, top_manager_name ORDER BY top_manager_id;
但这种语法兼容性较差,不如递归CTE通用。
内容的提问来源于stack exchange,提问作者Harper
相关产品推荐
相关产品推荐

