mysql5.7 递归查询
时间: 2023-07-06 12:40:33 浏览: 44
MySQL 5.7 支持递归查询功能,可以使用 WITH RECURSIVE 关键字来实现。
下面是一个示例,假设有一个表格存储了员工的信息,其中包括员工编号和直接上级编号:
```
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
name VARCHAR(50),
mgr_id INT
);
INSERT INTO employees VALUES (1, 'Alice', NULL);
INSERT INTO employees VALUES (2, 'Bob', 1);
INSERT INTO employees VALUES (3, 'Charlie', 2);
INSERT INTO employees VALUES (4, 'David', 3);
INSERT INTO employees VALUES (5, 'Eve', 4);
```
现在需要查询某个员工的所有直接或间接下属员工的信息,可以使用递归查询实现:
```
WITH RECURSIVE subordinates AS (
SELECT emp_id, name, mgr_id, 0 AS level
FROM employees
WHERE emp_id = 1 -- 查询员工编号为1的员工及其下属员工
UNION ALL
SELECT e.emp_id, e.name, e.mgr_id, s.level + 1
FROM employees e
JOIN subordinates s ON e.mgr_id = s.emp_id
)
SELECT emp_id, name, mgr_id, level
FROM subordinates;
```
在上面的查询语句中,使用了一个名为 subordinates 的递归公共表表达式(CTE),它包含了两个部分:
- 初始查询:SELECT emp_id, name, mgr_id, 0 AS level FROM employees WHERE emp_id = 1,返回员工编号为1的员工的信息,并设置 level 属性为0。
- 递归查询:SELECT e.emp_id, e.name, e.mgr_id, s.level + 1 FROM employees e JOIN subordinates s ON e.mgr_id = s.emp_id,返回直接下属员工的信息,并设置 level 属性为父节点的 level 属性加1,使用 JOIN 子句与递归公共表 subordinates 连接。
最终通过 SELECT 查询从递归公共表 subordinates 中返回所有下属员工的信息。