MariaDB中如何查询员工的上级的上级?自连接还是递归?
两种方案解决多级上级查询需求
1. 固定层级:多次自连接
如果只需要查询固定层级的上级(比如直接上级+上级的上级),可以直接在现有基础上继续自连接,写法简单直接。
扩展你的代码,新增一次左连接来关联上级的上级:
SELECT CONCAT(e.first_name, ' ', e.last_name) AS employee, CONCAT(s1.first_name, ' ', s1.last_name) AS direct_boss, CONCAT(s2.first_name, ' ', s2.last_name) AS boss_of_boss FROM employees e LEFT JOIN employees s1 ON e.manager_id = s1.employee_id LEFT JOIN employees s2 ON s1.manager_id = s2.employee_id;
这种方式的缺点是层级固定,如果要查更多层级,就得继续加JOIN,不适合层级不确定的场景。
2. 任意层级:递归CTE(推荐)
如果需要查询不确定层级的上级(比如从普通员工一直查到CEO),MariaDB 10.2及以上版本支持递归CTE(Common Table Expression),可以高效遍历整个层级链。
示例代码:查询每个员工的所有上级,包含层级关系:
WITH RECURSIVE employee_hierarchy AS ( -- 锚点成员:初始员工数据 SELECT employee_id, CONCAT(first_name, ' ', last_name) AS name, manager_id, 0 AS hierarchy_level FROM employees -- 可以加WHERE条件指定某个员工,比如WHERE employee_id = 100 UNION ALL -- 递归成员:关联上级数据 SELECT e.employee_id, CONCAT(e.first_name, ' ', e.last_name) AS name, e.manager_id, eh.hierarchy_level + 1 FROM employees e JOIN employee_hierarchy eh ON e.employee_id = eh.manager_id ) SELECT * FROM employee_hierarchy;
如果只需要展示某个员工的上级链条,可以在锚点成员里加WHERE employee_id = [目标员工ID],结果里hierarchy_level越大,层级越高。
方案对比
- 多次自连接:适合层级明确、固定的场景,代码易读,性能稳定。
- 递归CTE:适合层级不固定、需要全链路查询的场景,灵活性强,无需手动添加JOIN。
内容的提问来源于stack exchange,提问作者kevinBell
相关产品推荐
相关产品推荐

