mysql根据父节点递归查询所有子节点,List转树形结构工具类

本文涉及的产品
RDS AI 助手,专业版
RDS Agent(兼容OpenClaw),2核4GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: mysql根据父节点递归查询所有子节点,List转树形结构工具类

经常有业务需要递归查询MySQL树形结构某一节点的所有子节点,每次从网上扒拉找都得找半天,索性就自己总结一些自己遇到的比较好用的一些方法。

SQL方法一:

SELECT
  * 
FROM
  (
  SELECT
    t1.*,
  IF
    ( FIND_IN_SET( parent_id, @parent_ids ) > 0, @parent_ids := CONCAT( @parent_ids, ',', id ), '0' ) AS ischild 
  FROM
    ( SELECT * FROM blade_menu AS t WHERE t.is_deleted = 0 AND client_type = 'dianduyun_app' ORDER BY t.id ASC ) t1,
    ( SELECT @parent_ids := '1508255373140103170' ) t2 
  ) t3 
WHERE
  ischild != '0'

需要修改的地方

  • parent_id,改为你的父级id字段
  • blade_menu ,改为你的表名称
  • WHERE t.is_deleted = 0 ,改为你的查询条件
  • @parent_ids := ‘1508255373140103170’,值改为你要传入的父级id

执行结果

SQL方法二:

SELECT
  rd.* 
FROM
  ( SELECT * FROM fine_authority_object WHERE parentId IS NOT NULL AND is_deleted = 0 ) rd,
  ( SELECT @pid := '2342465874553522423' ) pd 
WHERE
  FIND_IN_SET( parentId, @pid ) > 0 
  AND @pid := concat( @pid, ',', id ) 
UNION
SELECT
  * 
FROM
  fine_authority_object 
WHERE
  FIND_IN_SET( id, @pid ) > 0;

需要修改的地方

fine_authority_object ,改为你的表名,以及后面的查询条件进行修改。


SELECT @pid := ‘2342465874553522423’ ,值改为你要传的父id的值


FIND_IN_SET( parentId, @pid ) ,parentId改为你的父级id字段名

备注:

  • 当前这条SQL是根据多个父节点查询所有子节点(包含自身)
  • 如果不想查询结果包含自身,去掉后边的union

执行结果示例

Java List转树形结构

另外再分享一个将上面查询出来的list给转成树形结构的形式给前端返回的一个工具类。

 public static List<ReportTemplateVo> listToTree2(List<ReportTemplateVo> list) {
        List<ReportTemplateVo> tree = new ArrayList<>();
        for (ReportTemplateVo ReportTemplateVo : list) {
            //找到根节点
            if (ReportTemplateVo.getParentId().equals("reportlets")) {
                tree.add(findChildren(ReportTemplateVo, list));
            }
        }
        return tree;
    }
    /**
     * 查找ReportTemplateVo的子节点
     * @param ReportTemplateVo
     * @param list
     * @return
     */
    private static ReportTemplateVo findChildren(ReportTemplateVo ReportTemplateVo, List<ReportTemplateVo> list) {
        List<ReportTemplateVo> children = new ArrayList<>();
        for (ReportTemplateVo node : list) {
            if (node.getParentId().equals(ReportTemplateVo.getId())) {
                //递归调用
                children.add(findChildren(node, list));
            }
        }
        ReportTemplateVo.setChildren(children);
        return ReportTemplateVo;
    }

ReportTemplateVo实体:

public class ReportTemplateVo  {
    private static final long serialVersionUID = 1L;
    /**
     * 主键ID
     */
    private String id;
    /**
     * 父节点ID
     */
    private String parentId;
    /**
     * 子孙节点
     */
    private List<ReportTemplateVo> children;
    @ApiModelProperty("节点是否可以被选中")
    private Boolean disabled;
    /**
     * 节点名称
     */
    @ApiModelProperty("节点名称")
    private String title;

总结

这两种方法都可以查询到自己想要的数据。然后调用这个方法可以直接生成相应的树形结构,这种东西很常用,又懒得自己写, 所以勤记录,多做备份会省很多事儿,

最后,愿大家都乐意分享一些高效开发小工具,减少重复造轮子~

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
存储 NoSQL Redis
【Redis】利用Redis List实现数据库分页快速查询
【Redis】利用Redis List实现数据库分页快速查询
937 0
|
存储 缓存 NoSQL
利用Redis List实现数据库分页快速查询的有效方法
利用Redis List实现数据库分页快速查询的有效方法
|
SQL 关系型数据库 分布式数据库
数据库内核那些事|细说PolarDB优化器查询变换:IN-List变换
数据库内核那些事|细说PolarDB优化器查询变换:IN-List变换
395 0
|
SQL 关系型数据库 MySQL
MySQL遍历所有父节点和子节点
MySQL遍历所有父节点和子节点
266 0
|
关系型数据库 MySQL 数据库
mysql 8.0 递归(例子分享)(sample database classicmodels _No.4)
本文介绍了如何在MySQL8.0中使用递归查询处理部门表和员工表的树形结构数据,包括查看文档、准备数据、递归处理以及提取层级信息。作者通过示例展示了WITHRECURSIVE语句的应用及其在数仓中的结构表示。
355 2
|
存储 算法 关系型数据库
探索MySQL递归查询,优雅的给树结构分页!
总结起来,对于MySQL中的树结构数据,递归查询结合预排序遍历树算法可以实现优雅的分页,但需要注意性能优化和数据更新的问题。这项技术提供了一种高效处理层级数据的工具,使得开发者可以在复杂的数据结构下实现直观和可靠的数据查询。
1050 1
|
关系型数据库 MySQL
13. Mysql 使用WITH进行复杂和递归查询
13. Mysql 使用WITH进行复杂和递归查询
1717 4
|
SQL Java 数据库连接
Mybatis查询 出现Unknow colum 'xxxx' in field list 解决办法
Mybatis查询 出现Unknow colum 'xxxx' in field list 解决办法
|
NoSQL Java Redis
Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
|
存储 NoSQL Java
【Redis】利用 Redis List 实现 Java 数据库分页快速查询
在大型应用中,数据库分页查询是日常开发中不可避免的需求之一。随着数据量的不断增加,传统的数据库分页方式可能会变得效率较低。为了解决这一问题,本文将介绍如何使用 Redis List 数据结构,结合 Java 编程语言,实现高效的数据库分页查询。
696 9

推荐镜像

更多