mysql with recusive
时间: 2025-06-29 08:19:42 浏览: 5
### MySQL 中 WITH RECURSIVE 的使用教程
#### 什么是 WITH RECURSIVE?
WITH RECURSIVE 是一种用于执行递归查询的 SQL 构造,在 MySQL 版本 8 及以上支持此功能。通过这种结构可以方便地处理层次化数据,比如员工管理关系树、分类目录等。
#### 基础语法
基础语法如下所示:
```sql
WITH RECURSIVE cte_name AS (
-- 非递归部分(初始成员)
SELECT ...
UNION ALL
-- 递归部分(后续成员)
SELECT ... FROM some_table JOIN cte_name ON ...
)
SELECT * FROM cte_name;
```
这里 `cte_name` 表示公用表表达式的名字,可以根据实际应用场景自定义名称[^4]。
#### 示例:构建员工层级结构
假设有一个名为 `Employees` 的表格存储着公司职员的信息及其上级管理者的关系。现在要找出所有直接或间接由特定经理领导下的所有下属人员列表。
```sql
WITH RECURSIVE subordinates AS (
-- 初始化子查询:找到最顶层的直属下级
SELECT employee_id
FROM Employees a
WHERE employee_id != 1 AND manager_id = 1
UNION ALL
-- 递归子查询:继续查找这些人的下级直到没有更多记录为止
SELECT a.employee_id
FROM Employees AS a
INNER JOIN subordinates AS s
ON a.manager_id = s.employee_id
)
SELECT * FROM subordinates;
```
这段代码首先选取了那些不是 CEO 并且其直接上司是 ID=1 的人作为起始点;接着利用循环的方式不断加入新的行到结果集中——即每次都将当前集合中的每个人员所管辖的人加进来,直至无法再扩展新节点位置[^3]。
#### 复杂案例:计算推广链路长度
考虑一个场景中有用户之间的推荐关系存在,想要知道某个用户的全部后代以及他们各自的代数,则可以通过下面的例子来实现这一目标:
```sql
CREATE TABLE IF NOT EXISTS sz_promotion_tree(
id BIGINT AUTO_INCREMENT,
user_id BIGINT COMMENT '用户ID',
parent_id BIGINT COMMENT '父辈/推荐者的User_ID',
create_time DATETIME,
PRIMARY KEY(id),
INDEX idx_user(user_id),
INDEX idx_parent(parent_id));
WITH RECURSIVE promotion_chain AS (
-- 起始层:指定根节点
SELECT p.*, 0 as level
FROM sz_promotion_tree p
WHERE p.user_id = @rootUserId
UNION ALL
-- 下一层:基于上一轮的结果集进行迭代展开
SELECT child.*, parent.level + 1
FROM sz_promotion_tree child
INNER JOIN promotion_chain parent
ON child.parent_id = parent.user_id
)
SELECT * FROM promotion_chain ORDER BY level ASC;
```
在这个例子中创建了一个临时表用来保存用户间的推广路径信息,并通过设置变量 `@rootUserId` 来控制从哪个具体用户开始追踪其直系和旁支亲属网络。最终输出不仅包含了所有的关联对象还附带了各自距离起点的距离级别[^5]。
阅读全文
相关推荐
















