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所有的数据,效果如下:

MySQL系列之查询具有层级数据_第1张图片

其实不用上面的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;

你可能感兴趣的:(mysql,笔记/经验,mysql,数据库,database)