MySQL 8 提供了相关递归处理的函数。
cte(Common Table Expressions):通用表表达式
示例:
WITH RECURSIVE cte AS (
# 初始: 获取 菜单表中 pid 是 0 的数据作为 cte的初始数据
SELECT * FROM sys_menu WHERE pid=0
UNION ALL
# 开始检查是否循环
# 将 菜单表的pId与 cte表的 id进行关联合并到cte,如果cte数据未增加 退出
SELECT sm.* FROM sys_menu sm, cte WHERE sm.pid = cte.id
) SELECT * FROM cte ORDER BY pid;
解释 :
- 初始化:将 ()内部的
UNION ALL
上半部分 的sql语句结果 作为cte
① - 待增数据:将 ()内部的
UNION ALL
下半部分 的sql语句结果作为待增数据
② - 合并:UNION ALL (
合并cte 与 待增数据
) ③ - 判断是否继续 ④
- 存在
待增数据
继续 执行② - 不存在
待增数据
退出
- 存在
模板:
WITH RECURSIVE cte AS (
# 初始化 cte
UNION ALL
# 将cte的数据作为基础表,与原始表关联 获取新数据
# 通过UNION ALL 给 cte 追加新数据
# 判断 新数据的数量 是否 不为空/继续递归
) SELECT * FROM cte