mysql8递归查询所有的下级

mysql递归查询所有的下级

在 MySQL 8 中,WITH RECURSIVE 语句可用于递归查询,特别适用于处理层级结构数据,如组织结构、目录树等。通过递归查询,能够获取某个节点以及该节点的所有下级(子节点及其子孙)。

假设我们有一个组织结构表 employees,其中包含 id(员工ID)、name(员工姓名)和 manager_id(上级员工的ID)。manager_id 用来表示员工的直接上级。

示例数据表结构
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 管理
递归查询示例:查询某个员工及其所有下级(包括子级、孙级等)
假设我们要查询 Alice(id=1)及其所有下级员工,可以使用递归查询:

sql
WITH RECURSIVE employee_hierarchy AS (
-- 基础查询:选择 Alice 作为根节点
SELECT id, name, manager_id
FROM employees
WHERE id = 1 -- Alice 的 ID

UNION ALL

-- 递归查询:选择 Alice 的直接下属
SELECT e.id, e.name, e.manager_id
FROM employees e
JOIN employee_hierarchy eh ON e.manager_id = eh.id
)
-- 查询 Alice 及其所有下属
SELECT id, name, manager_id
FROM employee_hierarchy
ORDER BY id;
解析:
基础查询:首先选取 id = 1 的员工(即 Alice),作为递归查询的起点。
递归查询:通过 JOIN 操作,将 employees 表与 employee_hierarchy CTE 进行连接,查询出 Alice 的直接下属。递归会继续查找下级员工(子节点、孙节点等),直到没有下属为止。
UNION ALL:保证递归查询会不断地获取下级员工,直到所有层级的员工都被查询到。
查询结果:
执行上述查询后,结果会显示 Alice 及其所有下属员工,包括直接下属和间接下属:

plaintext
+----+---------+------------+
| id | name | manager_id |
+----+---------+------------+
| 1 | Alice | NULL |
| 2 | Bob | 1 |
| 3 | Charlie | 1 |
| 4 | David | 2 |
| 5 | Eve | 2 |
| 6 | Frank | 3 |
+----+---------+------------+
说明:
基础查询部分:从 employees 表中选取 id = 1 的 Alice 作为递归查询的起点。
递归查询部分:查找所有 manager_id 等于前一轮查询结果中的员工 id 的员工,逐层向下递归,直到没有更多下级为止。
注意事项:
递归 CTE 必须包含 基础查询 和 递归查询 两部分,且递归查询部分通常通过 JOIN 来连接前一轮查询的结果。
使用递归查询时,MySQL 会自动处理递归的次数,直到没有新记录返回为止。
总结:
通过 WITH RECURSIVE,我们能够轻松地查询一个员工及其所有下级,适用于组织结构、文件夹结构等树形数据结构的查询。

发表评论

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