MYSQL递归查找菜单节点的所有子节点

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介: MYSQL递归查找菜单节点的所有子节点

先看上篇(MYSQL递归查询,根据子类ID查询所有父类(宇宙第一详细教程)_阿呆的博客的博客-CSDN博客_mysql递归查询所有父级)


表结构



SQL结构和数据


DROP TABLE IF EXISTS `demo`;
CREATE TABLE `demo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `pid` int(11) NOT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `demo` VALUES ('1', '0', 'A');
INSERT INTO `demo` VALUES ('2', '1', 'B');
INSERT INTO `demo` VALUES ('3', '1', 'C');
INSERT INTO `demo` VALUES ('4', '2', 'D');
INSERT INTO `demo` VALUES ('5', '2', 'E');
INSERT INTO `demo` VALUES ('6', '3', 'F');
INSERT INTO `demo` VALUES ('7', '3', 'G');


SQL语句


select id from (
              select t1.id,
              if(find_in_set(pid, @pids) > 0, @pids := concat(@pids, ',', id), 0) as ischild
              from (select id,pid from demo t order by pid, id) t1,
                   (select @pids := 1) t2
             ) t3 where ischild != 0

运行结果


分析过程                                                                                                            


1、看第二个 from 语句,后面的两个 select 合并,等效于如下SQL语句


select id,pid,@pids := 1 from demo t order by pid, id

运行结果



根据 pid 和 id 排序,并将要查询的菜单节点当做变量


2、看 if(express1,express2,express3)条件语句


if 语句类似三目运算符,当exprss1成立时,执行express2,否则执行express3;


详见(MySQL-IF()函数_阿呆的博客的博客-CSDN博客)


FIND_IN_SET(str,strlist)函数,str 要查询的字符串,strlist 字段名 参数以","分隔


如 (1,2,6,8),查询字段(strlist)中包含(str)的结果,返回结果为null或记录;


详见(MYSQL中find_in_set()函数用法详解_阿呆的博客的博客-CSDN博客_find_in_set()函数)


具体解释


把这个 IF 语句搞明白,整句SQL的意思就清楚了


我们将 if 语句中的三个参数,拆分为如下


express1 = find_in_set(pid, @pids) > 0
express2 = @pids := concat(@pids, ',', id),
express3 = 0


当条件一成立时,即@pids变量包含其父ID,则将@pids变量连接上 ,和其ID作为新的@pids变量,并把它取个别名 ischild


当条件一不成立时,则 0 as ischild


3、看第一个 form 语句


单独把 form 后面 SQL语句摘出来,如下


其实,通过第二步分析,已经能猜到临时表 t3 内容了


select t1.id,
              if(find_in_set(pid, @pids) > 0, @pids := concat(@pids, ',', id), 0) as ischild
              from (select id,pid from demo t order by pid, id) t1,
                   (select @pids := 1) t2

运行结果



可以看出和第三步我们的结论是一样的,因为ID为1的节点是顶级父节点,它的 pid 为0


因此 if 语句的express1不成立,故 0 as ischild (ischild = 0)


4、看判断条件 ischild != 0


这个其实就没什么好说了,但是我们将整句SQL改一下,这样可以更清楚的显示出SQL的执行过程


select id,t3.ischild from (
              select t1.id,
              if(find_in_set(pid, @pids) > 0, @pids := concat(@pids, ',', id), 0) as ischild
              from (select id,pid from demo t order by pid, id) t1,
                   (select @pids := 1) t2
             ) t3 where ischild != 0

运行结果



参考  mysql 递归查找菜单节点的所有子节点 - Rainydayfmb - 博客园


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
SQL 关系型数据库 MySQL
(B站动力节点老杜MySQL教程)MySQL课堂笔记-day01.txt
(B站动力节点老杜MySQL教程)MySQL课堂笔记-day01.txt
|
关系型数据库 MySQL 数据库
mysql 8.0 递归(例子分享)(sample database classicmodels _No.4)
本文介绍了如何在MySQL8.0中使用递归查询处理部门表和员工表的树形结构数据,包括查看文档、准备数据、递归处理以及提取层级信息。作者通过示例展示了WITHRECURSIVE语句的应用及其在数仓中的结构表示。
264 2
|
DataWorks 关系型数据库 MySQL
DataWorks产品使用合集之mysql节点如何插入数据
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
237 1
|
存储 算法 关系型数据库
探索MySQL递归查询,优雅的给树结构分页!
总结起来,对于MySQL中的树结构数据,递归查询结合预排序遍历树算法可以实现优雅的分页,但需要注意性能优化和数据更新的问题。这项技术提供了一种高效处理层级数据的工具,使得开发者可以在复杂的数据结构下实现直观和可靠的数据查询。
917 1
|
JSON NoSQL MongoDB
面试题MySQL问题之想使用Neo4j查询可变数量的关系节点如何解决
面试题MySQL问题之想使用Neo4j查询可变数量的关系节点如何解决
250 1
|
关系型数据库 MySQL
13. Mysql 使用WITH进行复杂和递归查询
13. Mysql 使用WITH进行复杂和递归查询
1545 4
|
SQL NoSQL 关系型数据库
实时计算 Flink版产品使用合集之mysql服务器只有1个节点,怎么改mysqlserver-id
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
存储 SQL 关系型数据库
实时计算 Flink版产品使用问题之要配置MySQL集群存储节点,该如何配置
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
负载均衡 关系型数据库 MySQL
MySQL PXC集群多个节点同时大量并发update同一行
如本文标题,MySQL PXC集群多个节点同时大量并发update同一行数据,会怎样? 为此,本人做了一个测试,来验证到底会怎样!
215 0
|
负载均衡 关系型数据库 MySQL
MySQL Router读写节点支持负载均衡策略
`routing_strategy`是MySQL Router配置选项,用于设定数据路由策略。可选值包括:`first-available`, `next-available`, `round-robin`和`round-robin-with-fallback`,分别对应不同的负载均衡和故障转移策略。更多详情参考:<https://dev.mysql.com/doc/mysql-router/8.0/en/mysql-router-conf-options.html#option_mysqlrouter_routing_strategy>。
323 1

推荐镜像

更多