在MySQL中进行递归查询通常涉及到公用表表达式 (Common Table Expressions, CTEs),这在MySQL 8.0及更高版本中可用。以下是一个使用递归CTE进行递归查询的简单示例:
假设我们有一个组织结构,其中有员工和经理,我们想要查询某个员工的所有下属(包括直接下属和间接下属)。
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(100),
manager_id INT,
FOREIGN KEY (manager_id) REFERENCES employees(id)
);
-- 插入示例数据
INSERT INTO employees (id, name, manager_id) VALUES
(1, 'Boss', NULL),
(2, 'Manager1', 1),
(3, 'Manager2', 1),
(4, 'Employee1', 2),
(5, 'Employee2', 2),
(6, 'Employee3', 3),
(7, 'Employee4', 4);
-- 查询示例,查询员工ID为2的所有下属
WITH RECURSIVE subordinates AS (
SELECT id, name, manager_id
FROM employees
WHERE id = 2 -- 起始点员工ID
UNION ALL
SELECT e.id, e.name, e.manager_id
FROM employees e
INNER JOIN subordinates s ON e.manager_id = s.id
)
SELECT * FROM subordinates;
在这个查询中,subordinates是一个递归公用表表达式 (CTE),它首先选择ID为2的员工作为起始点,然后通过UNION ALL操作符与其下属(即那些由manager_id指向起始点员工ID的员工)进行合并。通过内部的JOIN操作,递归继续向下查找,直到没有更多下属为止。