视觉差网站设计seo费用
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_idFROM employeesWHERE id = 1UNION ALL-- 递归部分:查询下属员工SELECT e.id, e.name, e.manager_idFROM employees eINNER JOIN subordinates s ON e.manager_id = s.id
)
-- 最终查询结果
SELECT * FROM subordinates;
示例二
根据任务的部门id找顶级部门
WITH RECURSIVE parent_dept AS (-- 初始查询,选择起始部门SELECT id, name, parent_idFROM system_deptWHERE id = 21 -- 要查询的部门idUNION ALL-- 递归查询,选择所有上级部门SELECT d.id, d.name, d.parent_idFROM system_dept dINNER JOIN parent_dept pd on d.id = pd.parent_id
)
SELECT id
FROM parent_dept
where parent_id = 0 -- 留下顶级部门id