mysql中递归的使用 WITH RECURSIVE

发布于:2025-02-11 ⋅ 阅读:(33) ⋅ 点赞:(0)

MySQL递归查询的基本语法和用法

MySQL 8.0及以上版本支持使用WITH RECURSIVE来进行递归查询。WITH RECURSIVE定义了一个递归的公用表表达式(CTE),它包含两个部分:递归的基础部分(非递归部分)和递归部分。

WITH RECURSIVE cte_name AS (
    -- 基础部分(非递归部分)
    SELECT ...
    UNION ALL
    -- 递归部分
    SELECT ...
    FROM cte_name ...
)
SELECT * FROM cte_name;

‌基础部分‌:这是递归查询的起点,它返回递归查询的初始结果集。
‌递归部分‌:这是递归查询的核心,它基于前一个结果集生成新的结果集,直到没有新的结果集产生为止。

实践编写MySQL递归SQL查询语句

假设我们有一个表示组织结构的表employees,结构如下:

CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    manager_id INT -- 上级员工的ID,自引用
);

查询某个员工(比如ID为1的员工)及其所有下属。

WITH RECURSIVE subordinates AS (
    -- 基础部分:查询初始员工(ID为1)
    SELECT id, name, manager_id
    FROM employees
    WHERE id = 1
    
    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;

示例二

根据任务的部门id找顶级部门

WITH RECURSIVE parent_dept AS (
    -- 初始查询,选择起始部门
    SELECT id, name, parent_id
    FROM system_dept
    WHERE id = 21 -- 要查询的部门id
    UNION ALL
    -- 递归查询,选择所有上级部门
    SELECT d.id, d.name, d.parent_id
    FROM system_dept d
    INNER JOIN parent_dept pd on d.id = pd.parent_id
)
SELECT id
FROM parent_dept
where parent_id = 0 -- 留下顶级部门id


网站公告

今日签到

点亮在社区的每一天
去签到