当前位置: 首页 > news >正文

MySQL通过SQL语句进行递归查询

这里主要是针对于MySQL8.0以下版本,因为MySQL8.0版本出来了一个WITH RECURSIVE函数专门用来进行递归查询的

先看下表格数据,就是很普通的树结构数据,通过parentId关联上下级关系

在这里插入图片描述

下面我们先根据上级节点id递归获取所有的下级节点数据,比如id为1

SELECT T2.id, T2.parent_id, T2.name
FROM (SELECT @r AS _id, (SELECT @r := id FROM t_test WHERE parent_id = _id LIMIT 1) AS idFROM (SELECT @r := 1) vars,t_test h WHERE @r IS NOT NULL
) T1 
JOIN t_test T2 ON T1._id = T2.parent_id
ORDER BY T2.id;

执行一下,可以看到可以获取到下级节点所有的数据

在这里插入图片描述

这里有个问题就是没有拿到当前节点数据,我们改一下

SELECT T2.id, T2.parent_id, T2.name
FROM (SELECT @r AS _id, @r := (SELECT id FROM t_test WHERE parent_id = _id LIMIT 1) AS idFROM (SELECT @r := 1) vars,t_testWHERE @r IS NOT NULL) T1 
JOIN t_test T2 
ON T1._id = T2.parent_id OR T1._id = T2.id
ORDER BY T2.id;

运行一下
可以发现虽然拿到了当前节点,但是也出现了重复数据问题,目前还没想好要怎么改,所以只能在外层接收数据的时候处理,或者再套一层group by一下

在这里插入图片描述

还有根据子节点查询所有上级节点的

SELECT T2.id, T2.parent_id, T2.name
FROM (SELECT @r AS _id, (SELECT @r := parent_id FROM t_test WHERE id = _id) AS parent_idFROM (SELECT @r := 5) vars,t_test h WHERE @r <> 0) T1 JOIN t_test T2 ON T1._id = T2.id

执行一下

在这里插入图片描述

如果只想要顶层的

SELECT T2.id, T2.parent_id, T2.name
FROM (SELECT @r AS _id, (SELECT @r := parent_id FROM t_test WHERE id = _id) AS parent_idFROM (SELECT @r := 5) vars,t_test h WHERE @r <> 0) T1 JOIN t_test T2 ON T1._id = T2.id
ORDER BY T2.id LIMIT 1;

运行一下

在这里插入图片描述

最后告诫大家一点,使用递归一定要小心小心再小心,特别是在SQL里面递归,一旦因为数据问题等导致无限循环就麻烦了,所以使用一定要慎重

相关文章:

  • python 蓝桥杯之并查集
  • 自动驾驶功能场景 逻辑场景 具体场景解释
  • 【Linux系统】线程
  • 复盘-word
  • 公众号IP白名单已添加服务器IP 122.88... 依然给出 40164 错误
  • 探索Java多线程开发
  • CSS3基础2
  • MySQL中的JOIN操作
  • Day19:信息打点-红蓝队自动化项目资产侦察武器库部署企查产权网络空间
  • PostgreSQL常用命令汇总
  • WPF DataGrid常用属性
  • AHU 数据库 实验五
  • 【论文整理】自动驾驶场景中Collaborative Methods多智能体协同感知文章创新点整理
  • STM32FreeRTOS信号量(STM32cube高效开发)
  • LeetCode 120. 三角形最小路径和
  • .pyc 想到的一些问题
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • Android Volley源码解析
  • Docker下部署自己的LNMP工作环境
  • JavaScript HTML DOM
  • Javascript编码规范
  • miaov-React 最佳入门
  • PAT A1050
  • Protobuf3语言指南
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • Vue组件定义
  • 从0到1:PostCSS 插件开发最佳实践
  • 浮现式设计
  • 前端临床手札——文件上传
  • 嵌入式文件系统
  • 十年未变!安全,谁之责?(下)
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 以太坊客户端Geth命令参数详解
  • 在weex里面使用chart图表
  • 自制字幕遮挡器
  • #{} 和 ${}区别
  • #android不同版本废弃api,新api。
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • ( 10 )MySQL中的外键
  • (04)odoo视图操作
  • (solr系列:一)使用tomcat部署solr服务
  • (四) Graphivz 颜色选择
  • (一)插入排序
  • (转) ns2/nam与nam实现相关的文件
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)负载均衡,回话保持,cookie
  • (转)母版页和相对路径
  • .FileZilla的使用和主动模式被动模式介绍
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET 反射的使用
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .Net 中Partitioner static与dynamic的性能对比
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • @DataRedisTest测试redis从未如此丝滑