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,我们能够轻松地查询一个员工及其所有下级,适用于组织结构、文件夹结构等树形数据结构的查询。