mysql根据父节点递归查询所有子节点

SELECT t3.*
FROM(SELECT t1.*,
            IF (FIND_IN_SET(parent_id, @pids) > 0,@pids := CONCAT(@pids, ',', id),'0') AS ischild
     FROM(SELECT t.id,t.parent_id,t.NAME
          FROM t_parent AS t
          ORDER BY t.id ASC) t1,
         (SELECT @pids := '0') t2) t3
WHERE ischild != '0'

使用时候把 t_parent 改成自己表,@pids := '0’ 这个是要查询的父id号(不包含自身)

SELECT rd.* 
FROM (SELECT * FROM sys_dict WHERE parent_id IS NOT NULL) rd,
     (SELECT @pid := '1') pd 
WHERE FIND_IN_SET(parent_id, @pid) > 0 
  AND @pid := concat(@pid, ',', id) 
union select * from sys_dict where id = @pid;

使用时候把 sys_dict 改成自己表,@pid := '1' 这个是要查询的父id号(包含自身)

如果不想查询结果包含自身,去掉后边的union

 

通过子id查询父id到根节点

SELECT t3.*
FROM(SELECT t1.*,
            IF (FIND_IN_SET(id, @ids) > 0,@ids := CONCAT( parent_id,',', @ids),'0') AS isparent
     FROM(SELECT t.id,t.parent_id,t.NAME
          FROM t_parent AS t
          ORDER BY t.id DESC) t1,
         (SELECT @ids := '111') t2) t3
WHERE t3.isparent != '0'

使用时候把t_parent 改成自己表,@ids := '111’这个是要查询的子id号,还有和查询父id不同的地方是ORDER BY t.id DESC,这里使用desc排序

复制代码
SELECT b.id,b.parent_id,b.name
FROM(
    SELECT @ids AS _ids,
    (SELECT @ids := GROUP_CONCAT(parent_id) FROM sys_dept WHERE FIND_IN_SET(id, @ids)) AS cids
    FROM sys_dept,(SELECT @ids := #{id}) b 
    WHERE @ids IS NOT NULL 
) a,sys_dept b 
WHERE FIND_IN_SET(b.id, a._ids) or FIND_IN_SET(b.id,a.cids)
ORDER BY id
复制代码

使用时候把 sys_dept  改成自己表

 

posted @   岁月记忆  阅读(1208)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示