MySQL 提供了递归查询功能,特别是在处理层次结构数据时非常有用,在 MySQL 8.0 及以上版本中,可以使用公共表表达式 (CTE) 和递归查询来实现这种需求。
基本概念
1、公共表表达式 (CTE, Common Table Expressions): 允许在一个查询中定义临时结果集,这个结果集可以在定义它的查询中被多次引用。
2、递归查询 (Recursive Queries): 通过递归的方式查询层次结构的数据。
使用示例
假设我们有一个员工表employees
,其中包含以下列:
id
: 员工ID
name
: 员工姓名
manager_id
: 上级经理的ID
我们希望查询某个员工及其所有下属的层次关系。
创建示例表并插入数据
CREATE TABLE employees ( id INT PRIMARY KEY, name VARCHAR(50), manager_id INT, FOREIGN KEY (manager_id) REFERENCES employees(id) ); INSERT INTO employees (id, name, manager_id) VALUES (1, 'Alice', NULL), (2, 'Bob', 1), (3, 'Charlie', 1), (4, 'David', 2), (5, 'Eve', 2), (6, 'Frank', 3), (7, 'Grace', 3);
递归查询示例
要查询 Alice 及其所有下属,我们可以使用递归 CTE:
WITH RECURSIVE employee_hierarchy AS ( 基础部分:选择根节点(Alice) SELECT id, name, manager_id, 0 AS level FROM employees WHERE id = 1 UNION ALL 递归部分:从基础部分开始,向下递归查找下属 SELECT e.id, e.name, e.manager_id, eh.level + 1 AS level FROM employees e INNER JOIN employee_hierarchy eh ON e.manager_id = eh.id ) SELECT * FROM employee_hierarchy;
解释
1、基础部分 (Anchor Member):
SELECT id, name, manager_id, 0 AS level FROM employees WHERE id = 1
这一步选择根节点 Alice,即id=1
的员工,并且设置初始层级为0
。
2、递归部分 (Recursive Member):
SELECT e.id, e.name, e.manager_id, eh.level + 1 AS level FROM employees e INNER JOIN employee_hierarchy eh ON e.manager_id = eh.id
这一步通过连接employees
表与当前递归结果employee_hierarchy
,找到每个员工的下属,并将层级加一。
3、最终查询:
SELECT * FROM employee_hierarchy;
这一步返回最终的递归结果,包括所有层级的员工信息。
结果示例
执行上述递归查询后的结果如下:
id | name | manager_id | level |
1 | Alice | NULL | 0 |
2 | Bob | 1 | 1 |
3 | Charlie | 1 | 1 |
4 | David | 2 | 2 |
5 | Eve | 2 | 2 |
6 | Frank | 3 | 2 |
7 | Grace | 3 | 2 |
通过这种方式,我们能够清晰地看到 Alice 及其所有下属的层次关系。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1230902.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复