MYSQL8递归

系统中市场需要用到递归功能的多为组织架构。如:部门,职位,推荐关系,地区管理。

  • 上述功能如果在非数据库中处理,翻页就会存在很大问题。导致页面加载很慢,MySQL8提供了CTE
  • 本文以部门举例

查询(父子关系)

WITH RECURSIVE t as
(
  SELECT part_id,part_pid,part_name FROM mo_user_part WHERE part_pid=0
  UNION ALL
  SELECT c.part_id,c.part_pid,CONCAT(t.part_name,'>',c.part_name) part_name FROM mo_user_part c,t WHERE t.part_id=c.part_pid
)
SELECT * FROM t;

  • 递归CTE需要加RECURSIVE关键字,使用Union all来产生结果
SELECT ...定义初始化值,不引用自身, 同时初始化值的列也定义了cte上的列的个数和类型,可以用cast重定义
UNION ALL
SELECT ....返回更多的值,并定义退出循环条件,这里引用了cte自身

查询(子父关系)

WITH RECURSIVE t as
(
  SELECT part_id,part_pid,part_name FROM mo_user_part WHERE part_id=19386136622112
  UNION ALL
  SELECT c.part_id,c.part_pid,CONCAT(c.part_name,'>',t.part_name) part_name FROM mo_user_part c,t WHERE t.part_pid=c.part_id
)
SELECT * FROM t;

连表方式

SELECT d1.id, d1.name
FROM departments d1
LEFT JOIN departments d2 ON d1.id = d2.parent_id
WHERE d2.id IS NULL; -- 这确保了只选择那些没有子部门的顶级或子部门

posted @ 2022-11-14 15:09  xunm  阅读(276)  评论(0)    收藏  举报