MySQL如何查找树形结构中某个节点及其子节点

 更新时间:2024年06月17日 11:26:48   作者:编程经验分享  
这篇文章主要介绍了MySQL如何查找树形结构中某个节点及其子节点问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

问题

设计表结构存储树形结构数据时,一般使用 parentId 来记录当前节点的父id。

表结构如下所示(以MySQL为例)

create table test
(
    id           varchar(30) collate utf8mb4_general_ci default '' not null
        primary key,
    name         varchar(100) collate utf8mb4_general_ci           null,
    parentId     varchar(30) collate utf8mb4_general_ci            null comment '父分类id'
)
    comment 'test';

查询出全部数据后通过每个节点各自的 parentId 就能够构造出整棵树。

但是,有些时候只想找到某个节点下的所有子节点,如果还是要查全表后构造整棵树再去查找目标节点,就显得很繁琐

如何解决

方法1:使用 MySQL 变量 + 函数

查询目标节点以及所有子节点,返回所有节点id,用【,】拼接

select GROUP_CONCAT(id) from (SELECT @ids as id,
                                      (SELECT @ids := GROUP_CONCAT(id) FROM test
                                       WHERE FIND_IN_SET(parentId, CONVERT(@ids USING utf8mb4) COLLATE utf8mb4_0900_ai_ci)
                                      ) AS childrenId
                               FROM test, (SELECT @ids := '节点id') var
                                WHERE @ids IS NOT NULL) t

同理,使用该方法还可以用来查询目标节点以及所有父节点

SELECT GROUP_CONCAT(id)  FROM
    (SELECT @id AS id,
            (SELECT @id := parentId FROM test WHERE id = CONVERT(@id USING utf8mb4) COLLATE utf8mb4_0900_ai_ci) AS pid
     FROM test, ( SELECT @id := '节点id') var WHERE @id IS NOT NULL) t

方法2:维护一个 path 字段

方法1的查询语句其实不好理解,不便后期维护。

(经评论区提醒,如果id之间存在包含关系的话,就不适用了)如果id字段长度固定的话,可以给表新增一个path字段。

create table test
(
    id           varchar(30) collate utf8mb4_general_ci default '' not null
        primary key,
    name         varchar(100) collate utf8mb4_general_ci           null,
    parentId     varchar(30) collate utf8mb4_general_ci            null comment '父分类id',
    path         varchar(500)                                      null comment 'id路径,逗号隔开'
)
    comment 'test';

path字段维护当前节点的所有父节点id,用【,】拼接

比如C节点的父节点是B,B节点的父节点是A,A是根节点

那么

  • C节点的path字段就为:A节点id,B节点id,C节点id
  • B节点的path字段就为:A节点id,B节点id
  • A节点的path字段就为:A节点id

然后根据path字段模糊查询便可以找到目标节点以及子节点了

select id from test where path like ‘%节点id%'

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Mysql的timeout以及python重连方式

    Mysql的timeout以及python重连方式

    这篇文章主要介绍了Mysql的timeout以及python重连方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • 对MySQL日志操作的一些基本命令总结

    对MySQL日志操作的一些基本命令总结

    这篇文章主要介绍了对MySQL日志操作的一些基本命令总结,其中重点讲述了二进制日志文件的相关方面,需要的朋友可以参考下
    2015-11-11
  • Mysql虚拟列的使用场景

    Mysql虚拟列的使用场景

    MySQL虚拟列是一种在查询时动态生成的特殊列,它不占用存储空间,可以提高查询效率和数据处理便利性,本文给大家介绍Mysql虚拟列的相关知识,感兴趣的朋友一起看看吧
    2025-01-01
  • 两个windows服务器使用canal实现mysql实时同步

    两个windows服务器使用canal实现mysql实时同步

    canal是阿里基于java写的一个组件,他的作用是canal.deployer读取mysql数据的binlog日志,然后canal.adapter将其转换为对应的数据(数据的变化或者变化后的数据,跟配置有关),并且同步到相关中间件,本文实现两个windows服务器使用canal实现mysql主从复制实时同步
    2025-03-03
  • MySQL Replication中的并行复制示例详解

    MySQL Replication中的并行复制示例详解

    MySQL在5.6版本之前,主从复制的从节点上有两个线程,分别是I/O线程和SQL线程,今天通过本文给大家介绍MySQL Replication中的并行复制示例详解,感兴趣的朋友一起看看吧
    2022-07-07
  • MySql5.x升级MySql8.x的方法步骤

    MySql5.x升级MySql8.x的方法步骤

    这篇文章主要介绍了MySql5.x升级MySql8.x的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • MySQL通过实例化对象参数查询实例讲解

    MySQL通过实例化对象参数查询实例讲解

    在本篇文章里我们给大家分享了关于MySQL如何通过实例化对象参数查询数据的相关知识点内容,有需要的朋友们可以测试参考下。
    2018-10-10
  • windows下mysql忘记root密码的解决方法

    windows下mysql忘记root密码的解决方法

    windows下mysql忘记root密码的解决方法,碰到这个问题的朋友可以参考下。
    2010-02-02
  • MySQL数据库高可用HA实现小结

    MySQL数据库高可用HA实现小结

    MySQL数据库是目前开源应用最大的关系型数据库,有海量的应用将数据存储在MySQL数据库中,这篇文章主要介绍了MySQL数据库高可用HA实现,需要的朋友可以参考下
    2022-01-01
  • MySQL中查询json格式的字段实例详解

    MySQL中查询json格式的字段实例详解

    这篇文章主要给大家介绍了关于MySQL中查询json格式字段的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论