Mysql树形表的两种查询方案(递归与自连接)

你有没有遇到过这样一种情况:
一张表就实现了一对多的关系,并且表中每一行数据都存在“爷爷-父亲-儿子-…”的联系,这也就是所谓的树形结构
在这里插入图片描述
对于这样的表很显然想要通过查询来实现价值绝对是不能只靠select * from table 来实现的,下面提供两种解决方案:

1.自连接

inner join 关键可以实现多种分类的查询,其实SQL很简单

SELECTone.id one_id,one.label one_label,two.id two_id,two.label two_label
FROMcourse_category oneINNER JOIN course_category two ON two.parentid=one.idINNER JOIN course_category three ON three.parentid=two.idWHERE one.id='1' AND one.is_show='1' AND two.is_show='1'ORDER BY one.orderby,two.orderby

也是规规矩矩的就查出一整棵树
在这里插入图片描述
这种查询的原则就是通过parentId去实现,“爷爷找爸爸,爸爸找儿子,儿子找孙子”,下面来逐帧慢放:
1.one在这里插入图片描述
2.one,two
在这里插入图片描述
3.one,two,three
在这里插入图片描述
可以看到,只有在树的层级确定的情况下我才能选择性的去自连接子表,某种意义上来讲这种方法存在弊端,我要是insert进去层级更低的新子节点那我的sql就得改变,从而就造成了一个“动一发而牵全身”的硬编码问题,实在是不够稳妥!

2.递归!

向上递归

首先声明,如果mysql的版本低于8是不支持递归查询的函数的!
下面来看一下如何用递归优雅的实现,从树根查到树顶:
先来看一个简单的Demo

	with RECURSIVE t1 AS(SELECT 1 AS nunion allSELECT n+1 FROM t1 WHERE n<5)SELECT * from t1

在这里插入图片描述
该怎么理解这每一步呢?
WITH RECURSIVE t1 AS:
这是递归查询的开始,创建了一个名为t1的递归表。
SELECT 1 AS n:
在t1表中,插入了一个初始行,值为1,命名为n。
UNION ALL:
使用UNION ALL运算符将初始行和递归查询结果合并,形成递归步骤。这也就是下次递归的起点表
SELECT n+1 FROM t1 WHERE n<5:
递归部分的查询,从t1表中选择n加1的结果,当n小于5时进行递归。
SELECT * FROM t1:
最终查询,返回t1表的所有行。
其实在使用递归的过程只需要注意要去避免死龟就好!
如何去查开头的那张树形表呢?这样就好:

with recursive temp as (
select * from  course_category p where  id= '1'union all
select t.* from course_category t inner join temp on temp.id = t.parentid
)
select *  from temp order by temp.id, temp.orderby

下面我们逐帧分析:
在这里插入图片描述
其实关键的地方就在于第三步,在树根的基础上去找叶子:
神之一手:
select t.* from course_category t inner join temp on temp.id = t.parentid
这就是递归相较于第一种方式可以无视层级inner jion的关键,因为这个动作已经被递归自动完成了,递归巧妙地一点就在这里!

向下递归

基于向上递归父找子的思想,向下递归则是子找父,即在叶子基础上union all之后去找根
子的parentId=父的id

with recursive temp as (
select * from  course_category p where  id= '1-1-1'union all
select t.* from course_category t inner join temp on temp.parentid = t.id  
//temp表是下次递归的基础
)
select *  from temp order by temp.id, temp.orderby

值得注意的是Mysql为了避免无限递归递归次数为1000次,也可以人为来设置cte_max_recursion_depth和max_execution_time来自定义递归深度和执行时间
使用递归的好处无需言语,一次io连接就搞定了全部

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

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

相关文章

Ubuntu 22.04安装过程

iso下载地址 Ubuntu Releases 1.进入引导菜单 选择Try or Install Ubuntu Server安装 2.选择安装语言 默认选择English 3.选择键盘布局 默认即可 4.选择安装服务器版本 最小化安装 5.配置网络 选择ipv4 选择自定义 DHCP也可 6.配置代理 有需要可以配置 这里跳过 7.软件源 …

Windows配置python(anaconda+vscode方案)的主要步骤及注意事项

Windows配置python&#xff08;anacondavscode方案&#xff09;的主要步骤及注意事项 1、准备工作 anaconda&#xff0c;官网下载&#xff08;直接下载最新版&#xff09;vscode&#xff0c;官网下载 (官网直接下载有可能太慢&#xff0c;可以考虑在国内靠谱的网站上下载&…

第7节-PhotoShop基础课程-视图调整

文章目录 前言1.视图菜单1. 视图操作1.校样颜色 Ctrl Y2.色域警告 Ctrl Shift Y3.像素长宽比 2.显示操作1.大小调整1.Alt 滚轮2.放大选项3.按空格 出现抓手 2.按屏幕大小缩放 Ctrl 0(数字0)3.按实际大小缩放 Ctrl 11.标准屏幕模式2.带有菜单栏的全屏模式3.全屏模式4.只显…

《PostgreSQL事务管理深入解析》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

HTML

HTML 1.HTML结构 1.1认识HTML HTML是超文本标记语言&#xff0c;电脑上看到的所有网站都是html实现的 HTML代码是“标签”构成的&#xff0c;简单来说&#xff0c;html就是一堆标签的组合 形如 <body>hello</body>标签名 (body) 放到 < > 中 大部分标签成…

Linux安全加固:保护你的服务器

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

什么是Jmeter?Jmeter使用的原理步骤是什么?

1.1 什么是 JMeter Apache JMeter 是 Apache 组织开发的基于 Java 的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于 Web 应用测试&#xff0c;但后来扩展到其他测试领域。 它可以用于测试静态和动态资源&#xff0c;例如静态文件、Java 小服务程序、CGI 脚…

多输入多输出 | MATLAB实现CNN-BiGRU卷积双向门控循环单元多输入多输出

多输入多输出 | MATLAB实现CNN-BiGRU卷积双向门控循环单元多输入多输出 目录 多输入多输出 | MATLAB实现CNN-BiGRU卷积双向门控循环单元多输入多输出预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 MATLAB实现CNN-BiGRU卷积双向门控循环单元多输入多输出&#xf…

GIS跟踪监管系统信息查询

GIS跟踪监管系统信息查询 GIS跟踪监管系统&#xff08;1&#xff09;物资查询与展示。① 几何查询。代码说明&#xff1a;② 物资定位。• 单个物资定位&#xff1a;• 多个物资定位&#xff1a;③ 物资统计。&#xff08;2&#xff09;物资信息更新① 新增物资。 GIS跟踪监管系…

【Tensorflow 2.12 电影推荐项目搭建】

Tensorflow 2.12 电影推荐项目搭建 学习笔记工具、环境创建项目项目配置安装相关python包召回模型实现排序模型实现实现电影推荐导入模块设置要推荐的用户召回推荐排序推荐推荐结果结尾学习笔记 Tensorflow 2.12 电影推荐项目搭建记录~ Tensorflow是谷歌开源的机器学习框架,可…

Kotlin File useLines nameWithoutExtension extension

Kotlin File useLines nameWithoutExtension extension import java.io.Filefun main(args: Array<String>) {val filePath "myfile.txt"val file File(filePath)println(file.name) //文件名字&#xff0c;不包括路径println(file.isFile) //是文件吗pri…

【深度学习】 Python 和 NumPy 系列教程(十五):Matplotlib详解:2、3d绘图类型(1):线框图(Wireframe Plot)

目录 一、前言 二、实验环境 三、Matplotlib详解 1、2d绘图类型 2、3d绘图类型 0. 设置中文字体 1. 线框图&#xff08;Wireframe Plot&#xff09; 一、前言 Python是一种高级编程语言&#xff0c;由Guido van Rossum于1991年创建。它以简洁、易读的语法而闻名&#xff0…

web安全漏洞-SQL注入实验2

实验目的 学习sql显注的漏洞判断原理掌握sqlmap工具的使用分析SQL注入漏洞的成因 实验工具 sqlmapsqlmap是用python写的开源的测试框架&#xff0c;支持MySQL&#xff0c;Oracle&#xff0c;PostgreSQL&#xff0c;Microsoft SQL Server&#xff0c;Microsoft Access&#x…

【Axure原型素材】扫一扫

今天和粉丝们免费分享扫一扫的原型素材&#xff0c;"扫一扫"是一项常见的移动应用功能&#xff0c;通常通过手机或平板电脑上的摄像头来扫描二维码或条形码以实现各种功能。下面是和大家分享扫一扫的常用素材~~~ 【原型效果】 【Axure原型素材】扫一扫 【原型预览】…

档案管理系统设计与实现

摘 要 近年来&#xff0c;随着企业彼此间的竞争日趋激烈&#xff0c;信息技术在企业的发展中占据着越来越重要的地位。在企业的运输生产中&#xff0c;档案已成为企业运输经营中不可或缺的一部分&#xff0c;为管理者进行管理决策和进行各种经营活动提供了重要的依据&#xf…

程序地址空间

✅<1>主页&#xff1a;&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;Linux——程序地址空间 ☂️<3>开发环境&#xff1a;Centos7 &#x1f4ac;<4>前言&#xff1a;我们一直随口就能说出来的栈区&#xff0c;堆区&#xff0c;常量…

基于Java的大学生选修选课系统设计与实现(亮点:多角色、贴近现实的选课流程、好看的系统外观)

大学生选修选课系统 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序&#xff08;小蔡coding&#xff09;2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 主要功能描述 五、系统实现5.1 管…

【基础篇】ClickHouse 表引擎详解

文章目录 0. 引言1. 什么是表引擎2. 不同表引擎使用场景1. MergeTree:2. Log:3. Memory:4. Distributed:5. Kafka:6. MaterializedView:7. File和URL: 3. MergeTree 家族3.1. MergeTree:3.2. ReplacingMergeTree:3.3. SummingMergeTree:3.4. AggregatingMergeTree:3.5. Collaps…

理解HTTPS/TLS/SSL(二)可视化TLS握手过程并解密加密数据

文章目录 WireShark抓包TLS握手过程Client HelloServer HelloEncryped Extenstions, Certificate, Certificate VerifyChange Ciper Spec, FinshedTLS 1.2和TLS 1.3的区别能不能在进一步&#xff1f; 解密WireShark中抓到的TLS包参考资料 上一篇文章已经在本地使用了生成自签名…

【Linux操作系统】信号的产生捕获

&#x1f525;&#x1f525; 欢迎来到小林的博客&#xff01;&#xff01;       &#x1f6f0;️博客主页&#xff1a;✈️林 子       &#x1f6f0;️博客专栏&#xff1a;✈️ Linux       &#x1f6f0;️社区 :✈️ 进步学堂       &#x1f6f0…