热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数据库技术:教你如何使用MySQL8递归的方法分享

之前写过一篇MySQL通过自定义函数的方式,递归查询树结构,从MySQL8.0开始终于支持了递归查询的语法CTE首先了解一下什么是CTE,全名CommonTableExpressi

之前写过一篇MySQL通过自定义函数的方式,递归查询树结构,从MySQL8.0开始终于支持了递归查询的语法

CTE

首先了解一下什么是CTE,全名CommonTableExpressions

WITH cte1AS(SELECTa,bFROMtable1), cte2AS(SELECTc,dFROMtable2) SELECTb,dFROMcte1JOINcte2 WHEREcte1.a=cte2.c;

cte1,cte2为我们定义的CTE,可以在当前查询中引用

可以看出CTE就是一个临时结果集,和派生表类似,二者的区别这里不细说,可以参考下MySQL开发文档:https://dev.mysql.com/doc/refman/8.0/en/with.html#common-table-expressions-recursive-examples

递归查询

先来看下递归查询的语法

WITHRECURSIVEcte_nameAS ( SELECT...--returninitialrowset UNIONALL/UNIONDISTINCT SELECT...--returnadditionalrowsets ) SELECT*FROMcte; 定义一个CTE,这个CTE最终的结果集就是我们想要的”递归得到的树结构”,RECURSIVE代表当前CTE是递归的 第一个SELECT为“初始结果集” 第二个SELECT为递归部分,利用”初始结果集/上一次递归返回的结果集”进行查询得到“新的结果集” 直到递归部分结果集返回为null,查询结束 最终UNIONALL会将上述步骤中的所有结果集合并(UNIONDISTINCT会进行去重),再通过SELECT*FROMcte;拿到所有的结果集

递归部分不能包括:

聚合函数例如SUM() GROUPBY ORDERBY LIMIT DISTINCT

上面的讲解可能有点抽象,通过例子慢慢来理解

WITHRECURSIVEcte(n)AS--这里定义的n相当于结果集的列名,也可在下面查询中定义 ( SELECT1 UNIONALL SELECTn+1FROMcteWHEREn<5 ) SELECT*FROMcte; --result +------+ |n| +------+ |1| |2| |3| |4| |5| +------+ 初始结果集为n=1 这时候看递归部分,第一次执行CTE结果集即是n=1,条件发现并不满足n<5,返回n+1 第二次执行递归部分,CTE结果集为n=2,递归…直至条件不满足 最后合并结果集

EXAMPLE

最后来看一个树结构的例子

CREATETABLE`c_tree`( `id`int(11)NOTNULLAUTO_INCREMENT, `cname`varchar(255)COLLATEutf8mb4_unicode_ciDEFAULTNULL, `parent_id`int(11)DEFAULTNULL, PRIMARYKEY(`id`) )ENGINE=InnoDBAUTO_INCREMENT=13DEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_unicode_ci; mysql>select*fromc_tree; +----+---------+-----------+ |id|cname|parent_id| +----+---------+-----------+ |1|1|0| |2|2|0| |3|3|0| |4|1-1|1| |5|1-2|1| |6|2-1|2| |7|2-2|2| |8|3-1|3| |9|3-1-1|8| |10|3-1-2|8| |11|3-1-1-1|9| |12|3-2|3| +----+---------+-----------+ mysql> WITHRECURSIVEtree_cteas ( select*fromc_treewhereparent_id=3 UNIONALL selectt.*fromc_treetinnerjointree_ctetcteont.parent_id=tcte.id ) SELECT*FROMtree_cte; +----+---------+-----------+ |id|cname|parent_id| +----+---------+-----------+ |8|3-1|3| |12|3-2|3| |9|3-1-1|8| |10|3-1-2|8| |11|3-1-1-1|9| +----+---------+-----------+ 初始结果集R0=select*fromc_treewhereparent_id=3 递归部分,第一次R0与c_treeinnerjoin得到R1 R1再与c_treeinnerjoin得到R2 … 合并所有结果集R0+…+Ri

更多信息

https://dev.mysql.com/doc/refman/8.0/en/with.html

您可能感兴趣的文章:MySQL通过自定义函数实现递归查询父级ID或者子级IDMysql树形递归查询的实现方法PHP递归写入MySQL实现无限级分类数据操作示例使用递归删除树形结构的所有子节点(java和mysql实现)MySQL之递归小问题php+mysql不用递归实现的无限级分类实例(非递归)MySQL递归查询树状表的子节点、父节点具体实现

标签: 递归 方法 SQL

mysql存储过程原理与使用方法详解

sql获取存储过程返回数据过程解析

上述就是数据库技术:教你如何使用MySQL8递归的方法分享的全部内容,如果对大家有所用处且需要了解更多关于mysql数据库学习教程,希望大家多多关注—编程笔记


推荐阅读
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了在MySQL8.0中如何查看性能并解析SQL执行顺序。首先介绍了查询性能工具的开启方法,然后详细解析了SQL执行顺序中的每个步骤,包括from、on、join、where、group by、having、select distinct、union、order by和limit。同时还介绍了虚拟表的概念和生成过程。通过本文的解析,读者可以更好地理解MySQL8.0中的性能查看和SQL执行顺序。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
author-avatar
豬仔珊珊_114
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有