MySQL系列之查询具有层级数据
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;
更多推荐
所有评论(0)