mysql8递归查询所有的上级

mysql8递归查询所有的上级

在 MySQL 8 中,如果你需要查询一个员工的所有上级(即父级、祖父级等),可以使用 WITH RECURSIVE 语句来实现。这种查询通常用于查找一个节点的所有父节点(上级)。

假设我们还是使用之前的 employees 表,结构如下:

sql
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
manager_id INT
);
示例数据:
sql
INSERT INTO employees (id, name, manager_id) VALUES
(1, 'Alice', NULL), -- Alice 是 CEO,没有上级
(2, 'Bob', 1), -- Bob 由 Alice 管理
(3, 'Charlie', 1), -- Charlie 由 Alice 管理
(4, 'David', 2), -- David 由 Bob 管理
(5, 'Eve', 2), -- Eve 由 Bob 管理
(6, 'Frank', 3); -- Frank 由 Charlie 管理
查询某个员工的所有上级
假设我们要查询员工 David(id=4)的所有上级,可以通过递归查询来实现:

sql
WITH RECURSIVE manager_hierarchy AS (
-- 基础查询:选择 David 作为起点
SELECT id, name, manager_id
FROM employees
WHERE id = 4 -- 选择 David 的 ID

UNION ALL

-- 递归查询:查找 David 的上级
SELECT e.id, e.name, e.manager_id
FROM employees e
JOIN manager_hierarchy mh ON e.id = mh.manager_id
)
-- 查询 David 的所有上级
SELECT id, name, manager_id
FROM manager_hierarchy
ORDER BY manager_id;
解析:
基础查询:首先选取员工 id = 4(即 David)作为递归查询的起点。
递归查询:通过 JOIN 操作,将 employees 表与 manager_hierarchy CTE 连接,查找出 David 的直接上级(即 manager_id)。递归查询将继续查找上级(父节点、祖父节点等),直到没有更多的上级为止。
UNION ALL:保证递归查询会不断地获取上级,直到没有更多的上级为止。
查询结果:
执行上述查询后,结果将会显示 David 的所有上级(包括 Bob 和 Alice):

plaintext
+----+---------+------------+
| id | name | manager_id |
+----+---------+------------+
| 4 | David | 2 |
| 2 | Bob | 1 |
| 1 | Alice | NULL |
+----+---------+------------+
说明:
基础查询部分:首先选择 id = 4 的 David 作为递归查询的起点。
递归查询部分:通过 JOIN 操作,查找 David 的直接上级(manager_id 等于 David 的上级的 id),然后递归查找其上级,直到找不到更多上级为止。
总结:
通过 WITH RECURSIVE,我们能够查询一个员工的所有上级(即所有父级、祖父级等),适用于层级结构数据的反向查询。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: