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

问题

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

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

create table test
(id           varchar(30) collate utf8mb4_general_ci default '' not nullprimary 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 testWHERE FIND_IN_SET(parentId, CONVERT(@ids USING utf8mb4) COLLATE utf8mb4_0900_ai_ci)) AS childrenIdFROM test, (SELECT @ids := '节点id') varWHERE @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 pidFROM test, ( SELECT @id := '节点id') var WHERE @id IS NOT NULL) t

 方法2:维护一个 path 字段

方法1的查询语句其实不好理解,不便后期维护。可以给表新增一个path字段。

create table test
(id           varchar(30) collate utf8mb4_general_ci default '' not nullprimary 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%’ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/722900.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gitlab的安装

1、下载rpm 安装包 (1)直接命令下载 wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-11.6.10-ce.0.el7.x86_64.rpm(2)直接去服务器上下载包 Index of /gitlab-ce/yum/el7/ | 清华大学开源软件镜像站 | Tsinghua Open Source…

Netty (10)-WebSocket

搭建服务基本配置参考第1篇。本篇仅介绍实现WebSocket服务器的关键代码 initChannel public void initChannel(SocketChannel ch) throws Exception {ChannelPipeline pipeline ch.pipeline(); pipeline.addLast(new HttpServerCodec()); pipeline.addLast(new Ht…

【图论】图的遍历 - 构建领接表(无向图)

文章目录 例题:受限条件下可到达节点的数目题目描述代码与注释模板抽象 例题:受限条件下可到达节点的数目 题目链接:2368. 受限条件下可到达节点的数目 题目描述 代码与注释 func reachableNodes(n int, edges [][]int, restricted []int)…

数学建模介绍

一、引言 数学建模,作为一种跨学科的方法论,已经逐渐成为科学研究、工程技术、社会经济管理等领域不可或缺的工具。简而言之,数学建模就是通过建立数学模型来模拟和解决实际问题。在这个过程中,我们需要将实际问题的复杂性和非线…

网络编程:select、poll

.1、select完成TCP并发服务器 程序代码&#xff1a; #include <myhead.h> #define SER_IP "192.168.125.234" //服务端IP #define SER_PORT 8888 //服务端端口号int main(int argc, const char *argv[]) {//1.创建用于连接的套接字int sfds…

1234. 替换子串得到平衡字符串

Problem: 1234. 替换子串得到平衡字符串 文章目录 思路解题方法复杂度Code 思路 这是一个滑动窗口问题。我们需要找到一个最小的子串&#xff0c;使得将其替换后&#xff0c;字符串中四种字符 ‘Q’, ‘W’, ‘E’, ‘R’ 的数量相等。我们可以通过滑动窗口的方式&#xff0c;找…

HTML实体字符列表,必看

HTML、CSS、JS三大部分都起什么作用&#xff1f; HTML内容层&#xff0c;它的作用是表示一个HTML标签在页面里是个什么角色&#xff1b;CSS样式层&#xff0c;它的作用是表示一块内容以什么样的样式&#xff08;字体、大小、颜色、宽高等&#xff09;显示&#xff1b;JS行为层…

基于QGIS的研究区域遥感影像裁切下载方法-以岳麓区为例

目录 前言 一、数据说明 1、遥感影像 2、矢量范围 二、按矢量范围导出 1、第一步、导出影像 2、第二步、设置输出格式 3、设置裁切范围 4、设置分辨率 三、按矢量范围掩膜 1、第一步、打开裁剪工具 2、第二步、参数设置 ​编辑 3、执行掩膜 四、webgis支持 1、生成运行…

计算机基础(面试重点)

文章目录 1. 计算机网络1.1 TCP/IP四层模型与OSI七层模型1.2 HTTP协议原理1.2.1 消息结构1.2.2 HTTP常见请求方法1.2.3 常见状态码 1.3 HTTPS协议原理1.4 TCP与UDP1.4.1 TCP三次握手1.4.2 TCP四次挥手1.4.3 常见热点问题1.4.4 浏览器输入URL并回车的过程以及相关协议&#xff1…

mac上更改vscode快捷键

以移动当前行代码为例 mac上的vscode&#xff0c;默认移动当前行代码的快捷键是⌥↑即option↑按键 现在我想改成command↑ 步骤如下 1.打开vscode-code-首选项-键盘快捷键 2.打开快捷键列表 3.输入move line&#xff0c;找到要改动的这个快捷键 当前行-右键-更改键绑定&…

【Redis】实际应用 - 监控工具

文章目录 1. Redis官方监控系统1.1 RedisInsight 2. 第三方Redis监控工具2.1 redis-stat2.2 KeyDB Web2.3 Netdata 3. 使用监控工具的好处4. 结语 在使用Redis作为数据存储引擎时&#xff0c;对其性能进行实时监控是确保系统稳定性和高性能的重要一环。本篇博客将介绍一些常用的…

pyg-创建消息传递网络

创建消息传递网络 — pytorch_geometric 文档 (pytorch-geometric.readthedocs.io) https://arxiv.org/abs/1801.07829 import torch from torch.nn import Sequential as Seq, Linear, ReLU from torch_geometric.nn import MessagePassing class EdgeConv(MessagePassing): …

数组转成set的底层实现

数组转成set的底层实现 要将Java数组转换为Set集合&#xff0c;可以使用Java集合框架中的HashSet或TreeSet。HashSet是基于哈希表的实现&#xff0c;不保证元素的顺序&#xff0c;而TreeSet是基于红黑树的实现&#xff0c;可以将元素按照一定顺序进行排序。 示例 下面是将Java数…

C语言 字符串的移动(滚动)数组的移动

/*字符串滚动 例:输入abcdef 像左移动3位 输出defabc*/ #include <stdio.h> #include <string.h> int main() {int i,t,n;char a[100],b[100];printf("请输入一串字符串&#xff1a;\n");gets(a);printf("向左还是向右移动&#xff08;1.左 2.右&…

鸿蒙 进程模型-公共事件

前提&#xff1a;基于官网3.1/4.0文档。参考官网文档 基于Android开发体系来进行比较和思考。&#xff08;或有偏颇&#xff0c;自行斟酌&#xff09; 一、 概念 应用中&#xff08;同一包名&#xff09;的所有UIAbility运行在同一个独立进程中。WebView拥有独立的渲染进程。 应…

微信小程序云开发教程——墨刀原型工具入门(页面交互+交互案例教程)

引言 作为一个小白&#xff0c;小北要怎么在短时间内快速学会微信小程序原型设计&#xff1f; “时间紧&#xff0c;任务重”&#xff0c;这意味着学习时必须把握微信小程序原型设计中的重点、难点&#xff0c;而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

excel统计分析——析因设计

参考资料&#xff1a;生物统计学 析因设计&#xff08;factorial design&#xff09;是同时研究多因素主效应和互作的有效试验设计方法。将所研究的因素按全部因素的所有水平的一切组合逐次进行试验&#xff0c;称为析因设计&#xff0c;也称为全因子试验设计。 1、设计方法 析…

web前端之uniApp实现选择时间功能

MENU 1、孙子组件1.1、html部分1.2、JavaScript部分1.3、css部分 2、子组件2.1、html部分2.2、JavaScript部分2.3、css部分 3、父组件3.1、html部分3.2、JavaScript部分 4、效果图 1、孙子组件 1.1、html部分 <template><view><checkbox-group change"ch…

蓝桥杯-大小写转换

转换方法 toLowerCase() String类的toLowerCase()方法可以将字符串中的所有字符全部转换成小写&#xff0c;而非字母的字符不受影响&#xff0c;语法格式如下&#xff1a; 字符串名.toLowerCase() //将字符串中的字母全部转成小写&#xff0c;非字母不受影响。 package chap…

nginx 基于IP的多虚拟主机配置

nginx 基于IP的多虚拟主机配置 1.基于IP的多虚拟主机配置 1.1 网络配置 linux操作系统支持IP别名的添加。 nginx 服务器提供的每台虚拟主机对应配置一个不同的IP&#xff0c;因此需要将网卡设置为同时能够监听多个IP地址。 先查看当前的网络配置&#xff1a;ifconfig 再为…