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

这篇具有很好参考价值的文章主要介绍了Mysql树形表的两种查询方案(递归与自连接)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

1.自连接

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

SELECT
	one.id one_id,
	one.label one_label,
	two.id two_id,
	two.label two_label
FROM
	course_category one
	INNER JOIN course_category two ON two.parentid=one.id
	INNER JOIN course_category three ON three.parentid=two.id
	WHERE one.id='1' AND one.is_show='1' AND two.is_show='1'
	ORDER BY one.orderby,two.orderby

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

2.递归!

向上递归

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

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

mysql树形结构sql查询,mysql,数据库
该怎么理解这每一步呢?
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

下面我们逐帧分析:
mysql树形结构sql查询,mysql,数据库
其实关键的地方就在于第三步,在树根的基础上去找叶子:
神之一手:
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连接就搞定了全部文章来源地址https://www.toymoban.com/news/detail-795394.html

到了这里,关于Mysql树形表的两种查询方案(递归与自连接)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构学习系列之顺序表的两种删除方式

    方式1: 在顺序表的末端删除所存储的数据元素,代码如下: 示例代码: 注意事项: 1.形参传入到具有删除数据元素功能的函数后,需要做 入参合理性检查 ; 2.还需要判断此时 顺序表所存储的数据元素是否为空 ; 3. count是计数的变量 , 每次删除一个数据元素后,需要减

    2024年02月10日
    浏览(31)
  • 数据结构学习系列之顺序表的两种插入方式

    方式1: 在顺序表 末端插入 数据元素,代码如下: 示例代码: 注意事项: 1.形参传入到具有插入数据元素功能的函数后,需要做 入参合理性检查 ; 2.还需要判断此时 顺序表所存储的数据元素是否已满 ; 3.本示例代码中的 count是计数的变量 , 每次插入一个数据元素后,需

    2024年02月10日
    浏览(28)
  • css——文字实现渐变色的两种方案

    (一)通过设置color、background-image及background-clip实现文字颜色渐变 注意:如果使用的是块级元素,记得加上 background-color: transparent 效果如下: (二)通过svg的linearGradient及text元素实现文字的颜色渐变 效果如下:

    2024年01月21日
    浏览(35)
  • Java生成Echarts表图的两种方案

    简介 JFreeChart是JAVA平台上的一个开放的图表绘制类库。它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP等使用所设计。JFreeChart可生成饼图(pie charts)、柱状图(bar charts)、散点图(scatter plots)、时序图(time series)、甘特图(Gantt charts)等等多种图表,并且可

    2024年02月16日
    浏览(28)
  • 关于 Token 过期问题的两种解决方案

     对于token过期,我们有两种方案:   方案一:当我们操作某个需要token作为请求头的接口时,返回的数据错误error.response.status === 401,说明我们的token已经过期了。 我们希望当响应返回的数据是401身份过期时,让当前浏览页面强行跳转到登入页面,让用户 手动更新token。拿到

    2024年01月17日
    浏览(30)
  • error: (-215:Assertion failed)的两种解决方案

    问题描述:在对视频分帧读取进行差值哈希算法比较时出现读取错误现象,具体代码内容和报错如下: 而在差值哈希算法运行前,均值哈希算法可以正常运行: 反复仔细观察上述两段代码之后判断是img图片路径读取失败,下方为两种解决方法: 1. 删除报错语句的下方部分:

    2024年02月15日
    浏览(36)
  • MySQL中的两种特殊插入方式

    代码案例 PointMapper.java PointMapper.xml 代码案例 PointMapper.java PointMapper.xml on duplicate key update 和 replace into 是两种处理重复键冲突的方法,但它们具有一些区别 功能不同 on duplicate key update 在插入数据时,如果遇到重复键冲突,会更新已存在的行的值 replace into在插入数据时,如果遇

    2024年02月12日
    浏览(48)
  • Linux 删除大量小文件的两种方案 | 运维进阶

    【摘要】 Linux如何删除大量小文件?本文介绍了两种方法。 【作者】赵靖宇 环境: RHEL 6.5 + Oracle 11.2.0.4 需求: 使用df -i巡检发现Inodes使用率过高,需要清理删除文件来解决。如果Inodes满,该目录将不能写,即使df -h查看还有剩余空间。 这是因为通配符*在执行时会替换为具体

    2024年02月08日
    浏览(37)
  • 解决Windows Defender安全中心打开空白的两种方案

    有网友加粉丝群询问自己的 Windows 10 操作系统中的 Windows Defender 安全中心打开后出现页面空白情况,而之前自己也没有碰到过这种问题。既然问题来了,那就帮助找下解决方案,目前网络上其实也有给出一些解决方案,绝大部分是通过注册表方式来进行解决。不过有些网友表

    2024年02月10日
    浏览(31)
  • 无线路由器连接有线路由器的两种方案

    无线路由器连接有线路由器设置 描述:无线路由器tp-link tl-wr841n 连接有线路由器tp-link(具体型号不清)下面的设置都是以这两个路由器为例进行设置 目的:想从有线路由器接到无线路由器,实现无线上网功能 说明:无线连接有线两种方案: 1.无线wan口连接有线lan口 2.无线lan口

    2024年02月07日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包