用 心 生 活 , 用 心 爱 你 😘|

DaenMax

园龄:3年7个月粉丝:52关注:0

mysql的递归写法:部门层级

前言

详细的可以参考:https://cloud.tencent.com/developer/article/2106748
这里用 WITH RECURSIVE 实现递归,需要 MySQL 8.0 版本以上
示例里没有加逻辑删除字段的筛选,自己加上即可,例如 is_delete = 0
oracle的递归看我另一篇博文:https://www.cnblogs.com/daen/p/17252462.html

表结构

数据

查询子节点

示例

WITH RECURSIVE recursion AS (
	SELECT
		sd1.* 
	FROM
		sys_dept sd1 
	WHERE
		sd1.id = '101' UNION ALL
	SELECT
		sd2.* 
	FROM
		sys_dept sd2,
		recursion t2 
	WHERE
		sd2.parent_id = t2.id 
	) SELECT
	t1.* 
FROM
	recursion t1;

或者

WITH RECURSIVE recursion ( id, NAME, parent_id ) AS (
	SELECT
		sd1.id,
		sd1.NAME,
		sd1.parent_id 
	FROM
		sys_dept sd1 
	WHERE
		sd1.id = '101' UNION ALL
	SELECT
		sd2.id,
		sd2.NAME,
		sd2.parent_id 
	FROM
		sys_dept sd2,
		recursion t2 
	WHERE
		sd2.parent_id = t2.id 
	) SELECT
	t1.id,
	t1.NAME,
	t1.parent_id 
FROM
	recursion t1;

结果

不含自己的写法

加个不等于即可

查询父节点

示例

WITH RECURSIVE recursion AS (
	SELECT
		sd1.* 
	FROM
		sys_dept sd1 
	WHERE
		sd1.id = '103' UNION ALL
	SELECT
		sd2.* 
	FROM
		sys_dept sd2,
		recursion t2 
	WHERE
		sd2.id = t2.parent_id 
	) SELECT
	t1.* 
FROM
	recursion t1;

结果

不含自己的写法

加个不等于即可

查询子节点和父节点的区别

其实就是将 parent_idid 换换位置而已

多行合并一行

就是我输入部门ID,然后获取到他的所有的父级的部门名称,拼接成一个字符串

示例

WITH RECURSIVE recursion AS (
	SELECT
		sd1.* 
	FROM
		sys_dept sd1 
	WHERE
		sd1.id = '103' UNION ALL
	SELECT
		sd2.* 
	FROM
		sys_dept sd2,
		recursion t2 
	WHERE
		sd2.id = t2.parent_id 
	) SELECT
	group_concat( t1.`name` ORDER BY t1.`level` ASC SEPARATOR '#' ) AS nameList 
FROM
	recursion t1;

结果

本文作者:DaenMax

本文链接:https://www.cnblogs.com/daen/p/17252369.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   DaenMax  阅读(302)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起