MySQL递归查询

一、为什么要使用MySQL递归查询

        在很多场景下有树形表需要去遍历,若通过编程语言去递归遍历树将多次进行与数据库的交互操作,相当于100个葡萄去楼下超市买100次,在路上多走了99次浪费了大量时间,肯定不如一次买100葡萄省事。所以与其让编程语言递归遍历不如在MySQ历数L层面递归遍据减少数据传输造成的资源浪费

二、递归查询

前提:MySQL8.0及以上版本

语法:

with recursive 临时表 (临时字段1,临时字段2,. . .) as
(
    select 初始化表数据...
    union all
    select 基于临时字段的新数据... from 临时表 ...
)
select ... from 临时表;

说明:

        ① 递归查询:相当于定义了一张临时表。

        ② 第一个括号:定义表的字段。

        ③ as之后的括号:定义表数据的获取过程。

        ④ 第一个select语句:用于给空表添加数据,即临时表数据初始化。

        ⑤ 第二个select语句:用于执行递归过程,将上一轮查出的结果集进行遍历,拿到新的结果集放到临时表中。

        ⑥ 用union all 进行连接:代表将每一次的结果集都放到临时表中;

            用union连接:代表每次将结果集放到临时表时都会进行去重操作。

        ⑦ 最后一个select:用于对临时表的查询。

当然,语法并不固定,只要 在第一个select中进行表初始化,第二个select中基于上一次结果集进行递归查询 即可

案例:

初始化临时表t的num字段数据为1,递归获取到3

with recursive t(num) as (
    select 1
    union all
    select num + 1 from t where num + 1 <= 3
)
select num from t;

递归查询过程如下:

初始化空表

ff501dd6748b479d8a8abcf8af1efd22.png

遍历上一次结果集(1),在此基础上获取新数据(2)  

441c9a6c0d5644f09a7f55f0f2e13c6f.png

 遍历上一次结果集(2),在此基础上获取新数据(3)  3b5ffa20d9854c7b8c01d128b7cf61be.png

自此,递归获取数据完毕!

可以看到每次迭代都是从上一次结果集中遍历取数据,然后将新的结果集放到表中,直到递归终止。

获取节点7的所有祖先e86be92ccdd440aa8dc398c3c35d2192.png

sql脚本:

create table category
(
    id bigint auto_increment primary key,
    name   varchar(20) not null,
    parent bigint
);
​
INSERT INTO `mysql-learn`.category (id, name, parent) VALUES (1, '1', null);
INSERT INTO `mysql-learn`.category (id, name, parent) VALUES (2, '2', 1);
INSERT INTO `mysql-learn`.category (id, name, parent) VALUES (3, '3', 1);
INSERT INTO `mysql-learn`.category (id, name, parent) VALUES (4, '4', 2);
INSERT INTO `mysql-learn`.category (id, name, parent) VALUES (5, '5', 2);
INSERT INTO `mysql-learn`.category (id, name, parent) VALUES (6, '6', 3);
INSERT INTO `mysql-learn`.category (id, name, parent) VALUES (7, '7', 6);

递归查询语句

with recursive ancestor(name, parent) as (
    select name,parent from category where id = 7
    union all
    select c.name, c.parent from category c, ancestor a where c.id = a.parent
)
select * from ancestor;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

景联文科技:专业数据标注公司,推动AI技术革新

数据标注作为AI技术发展的重要支撑&#xff0c;对于训练高质量的机器学习模型以及推动应用领域的创新具有不可替代的作用。 景联文科技作为专业的数据标注公司&#xff0c;致力于提供专业的数据标注服务&#xff0c;帮助客户解决AI链条中的数据处理难题&#xff0c;共同推动人工…

2024霸王餐小程序cps,h5公众号小程序开源版系统搭建开发,外卖霸王餐小程序系统源码

目录 前言&#xff1a; 一、霸王餐小程序的操作是怎么样的&#xff1f; 二、霸王餐系统后台 三、怎么搭建部署? 前言&#xff1a; 霸王餐项目基于美团和饿了么平台开发的小程序。 一、霸王餐小程序的操作是怎么样的&#xff1f; 1、进入小程序后选择自己要下单的店铺&am…

RTMP播放器延迟最低可以做到多少?

技术背景 RTMP播放器的延迟可以受到多种因素的影响&#xff0c;包括网络状况、推流设置、播放器配置以及CDN分发等。因此&#xff0c;RTMP播放器的延迟并不是一个固定的数值&#xff0c;而是可以在一定范围内变化的。 正常情况下&#xff0c;网上大多看到的&#xff0c;针对R…

华为手机找不到wifi调试?不急,没有wifi调试一样可以进行局域网模式调试

最近小黄在使用uniapp启动无线调试的时候突然发现华为的手机突然找不到wifi调试了&#xff0c;那么我们怎么进行无线调试呢&#xff1f; 其实他只是找不到开关而已&#xff0c;正常使用就行。 1.使用数据线连接手机。 打开cmd命令行执行&#xff1a;adb tcpip 5555 2.再执行ad…

论文120:Giga-SSL: Self-supervised learning for gigapixel images (2023, CVPR, 开源)

文章目录 1 要点2 方法2.1 算法设计2.2 设计选择 1 要点 题目&#xff1a;用于千兆像素图像的自监督学习 (Giga-SSL: Self-Supervised Learning for Gigapixel Images) 代码&#xff1a;https://github.com/trislaz/gigassl 研究目的&#xff1a; 现有的WSI分类方法依赖于有…

云计算之大数据(上)

目录 一、Elasticsearch 1.1 产品组件 1.1.1 X-Pack 1.1.2 Beats数据采集中心 1.1.3 Logstash 1.1.4 Kibana 1.2 架构特性 1.2.1 性能 1.2.2 安全性 1.2.3 可用性 1.2.4 可扩展性 1.2.5 可维护性 1.2.6 国际化 1.3 综合检索分析 1.4 全观测 1.5 大数据检索加速…

PAT甲级-1029 Median

题目 题目大意 给定两个递增序列&#xff0c;求这两个序列合并为一个递增序列后的中位数。 思路 直接用一个数组接收两个数组的输入&#xff0c;然后用sort()暴力求解&#xff0c;也可以过&#xff0c;但是时间复杂度较高。 更好的方法是双指针法&#xff0c;两个数组各一个…

在线plotly绘制动态旭日图,展示复杂数据层次结构

探索数据的层次之美&#xff1a;旭日图&#xff0c;以环环相扣的视觉效果&#xff0c;清晰展现数据的层级关系。搭配Plotly的动态可视化技术&#xff0c;不仅让数据层次一目了然&#xff0c;更通过交互式操作&#xff0c;让用户轻松探索每个层级的详细信息&#xff0c;享受数据…

解决移动端1px 边框优化的8个方法

前言 您是否注意到 1px 边框在移动设备上有时会显得比预期的要粗&#xff1f;这种不一致源于移动屏幕的像素密度不同。 在 Web 开发中&#xff0c;我们使用 CSS 来设置页面样式。但是&#xff0c;CSS 中的 1px 并不总是转换为设备上的物理 1px。这种差异就是我们的“1px 边框…

如何在网上找客户资源

在网上寻找客户资源可以通过多种渠道和方法来实现&#xff0c;这些方法结合不同的工具和平台&#xff0c;可以帮助你快速定位目标客户。以下是一些常见且有效的途径&#xff1a; 1. 利用搜索引擎 使用搜索引擎&#xff08;如百度、Google&#xff09;通过关键词搜索目标客户或…

JAVA一键开启缘分之旅红娘相亲交友系统小程序源码

一键开启缘分之旅 —— 红娘相亲交友系统 &#x1f496; 初遇心动&#xff0c;一键启程 在这个快节奏的时代&#xff0c;找到那个对的人似乎成了一种奢侈。但别担心&#xff0c;有了“红娘相亲交友系统”&#xff0c;你的缘分之旅只需一键即可开启&#xff01;无需复杂的注册流…

张雪峰:物联网行业迎高光时刻!如何选择?我们诚聘销售工程师!

作为一间10多年的物联网公司&#xff0c;各位求职人士可以看看我们其中一个招聘要求&#xff0c;和自己需求结合分析分析&#xff0c;希望对你们有所帮助。 【公司实力底蕴】 盈电智控物联网科技&#xff08;广东&#xff09;有限公司&#xff0c;2024年7月成立&#xff0c;是…

git pull之后发现项目错误,如何回到之前的版本方法

目录 首先我们打开小程序的cmd的黑窗口&#xff0c;git reflog查看之前的版本 之后再git reset --hard main{1} 我这个就已经返回了之前的6daaa2e的版本了 首先我们打开小程序的cmd的黑窗口&#xff0c;git reflog查看之前的版本 之后再git reset --hard main{1} 我这个就已…

深度学习的发展历程

深度学习的起源 在机器学习中&#xff0c;我们经常使用两种方式来表示特征&#xff1a;局部表示&#xff08;Local Representation&#xff09;和分布式表示&#xff08;Distributed Representation&#xff09;。以颜色表示为例&#xff0c;见下图&#xff1a; 要学习到一种好…

自动驾驶ADAS算法--使用MATLBA和UE4生成测试视频

原文参考&#xff1a;金书世界 环境搭建参考&#xff1a;用MATLAB2020b和虚拟引擎&#xff08;Unreal Engine&#xff09;联合仿真输出AVM全景测试视频----Matlab环境搭建 matlab参考&#xff1a; https://ww2.mathworks.cn/help/driving/ug/simulate-a-simple-driving-sce…

分库分表核心理念

文章目录 分库&#xff0c;分表&#xff0c;分库分表什么时候分库&#xff1f;什么时候分表&#xff1f;什么时候既分库又分表&#xff1f;横向拆分 & 纵向拆分 分表算法Range 范围Hash 取模一致性 Hash斐波那契散列 严格雪崩标准&#xff08;SAC&#xff09;订单分库分表实…

导入word模板的数据到DB,偏自学,可自改套用

GetMapping("/importTestPeople")public void importTestPeople(RequestParam("file") MultipartFile multipartFile) throws IOException {InputStream inputStream null;File file null;try {// 创建临时文件file File.createTempFile("temp&quo…

从0开始深入理解并发、线程与等待通知机制

1、 从0开始深入理解并发、线程与等待通知机制 从上面两大互联网公司的招聘需求可以看到&#xff0c;大厂的Java岗的并发编程能力属于标配。 而在非大厂的公司&#xff0c;并发编程能力也是面试的极大加分项&#xff0c;而工作时善用并发编程则可以极大提升程序员在公司的技术…

前向渲染路径

1、前向渲染路径处理光照的方式 前向渲染路径中会将光源分为以下3种处理方式&#xff1a; 逐像素处理&#xff08;需要高等质量处理的光&#xff09;逐顶点处理&#xff08;需要中等质量处理的光&#xff09;球谐函数&#xff08;SH&#xff09;处理&#xff08;需要低等质量…

phpmyadmin报错mysqli::real_connect(): (HY000/1045): Access denied for user ‘

问题分析 这是因为本身还安装了MySQL&#xff0c;导致发生冲突&#xff0c;只需要找到自己安装的进行关闭即可 方法 在任务管理器(快捷键&#xff1a;ctrlaltdelete)-服务中&#xff0c;找到对应的MySQL进行关闭