MySQL查询具有层级数据

MySQL查询具有层级数据,第1张

MySQL查询具有层级数据

(示例数据是小冰自己的数据库哦,其中parent_id是必不可少的,因为这个是决定层级关系的字段)

--按照层级关系查询机构部门数据(Tree)
WITH RECURSIVE temp AS (
    SELECt r.* FROM sys_dept r 
    UNIOn ALL
    SELECt r.* FROM sys_dept r,temp t WHERe t.id = r.parent_id
)select DISTINCT temp.* from temp;

根据上面的sql查出来的数据,在程序中使用递归的方式(待更新),可以转换为层级树,返回给前端,前端再渲染一下,就可以得到一个具有阶级的Tree所有的数据,效果如下:

 

其实不用上面的sql,直接用代码写递归的方式也可以做到这个效果,用这个sql只是省去了一些排序、层级处理等逻辑

以下的sql是用在特定的业务场景下,酌情使用哦!

--根据子部门机构id查询顶级机构id,其中parent_id是父级id,parent_id=0是最顶级
SELECt
	T2.* 
FROM
(
    SELECt
		@r AS _id,
		( SELECT @r := parent_id FROM sys_dept WHERe id = _id ) AS parent_id,
		@l := @l + 1 AS lvl 
	FROM
		( SELECt @r := #{子集id}, @l := 0 ) vars,
		sys_dept h 
	WHERe
		@r != 0 
) T1 JOIN sys_dept T2 ON T1._id = T2.id AND T2.parent_id = 0
	
--根据某一个id查询该id下的所有子集,忽略深度,直接找到最后一个子集id
SELECT
	id 
FROM
(
    SELECt
		t1.id,
		t1.parent_id,
		t2.*,
	IF
		( find_in_set( parent_id, @pids ) > 0, 
        @pids := concat( @pids, ',', id ), 0 ) AS ischild 
	FROM
		( SELECt id, parent_id FROM sys_dept t WHERe ORDER BY parent_id, id ) t1,
		( SELECT @pids := #{需要查的id}) t2
) t3 WHERe ischild != 0;

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/zaji/5701922.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存