MySQL递归查询(with recursive)

背景

日常开发中经常会有那种 阶梯式 数据,比如做地图、菜单,裂变给上级、上上级分红等等这样的需求的时候

你需要找个一个对象的 上级,上上级,上上上级

在这里插入图片描述
建了一张很容易理解阶级的表,一目了然
很多时候我们的需求就是,通过任何一个人的id,找到它所有的上级,比如我们想通过儿子的id,找他的"族谱"

我们的确是可以用 递归 的思想去做这个事,用代码可以轻易地实现。与此同时我们也会发现,连接数据库的次数,也和我们递归的次数相同,这还是耗费资源的

还有没有其它的方法呢?这也是曾经一个面试官问我的问题,现在想来,当时的确没回答好,今天它来了

with recursive

它是什么?

MySQL with Recursive是一种基于递归思想的MySQL查询方式,可以实现对数据的递归查询和处理,返回符合条件的数据。在MySQL 8.0版本中,该功能被正式引入。

语法:

WITH RECURSIVE temp(column_list) AS (
    SELECT query_list
    UNION [ALL]
    SELECT query_list
    FROM table_name
    WHERE condition
)
SELECT * FROM temp

解释:
WITH RECURSIVE:

表示要使用递归查询的方式处理数据

temp:

给这个临时的递归表取个名字,可以在初始查询和递归查询中引用

column_list:

表示 temp 查询表中包含的列名,列名之间用逗号分隔

UNION ALL

将两个查询结果集进行联合

以上面那张表为例,我想找到儿子的 “族谱”

WITH recursive temp AS (
SELECT
	id,
	`name`,
	parent_id 
FROM
	person 
WHERE
	id = 3 UNION ALL
SELECT
  p.id,
	p.`name`,
	p.parent_id 
FROM
	person p,
	temp 
WHERE
	p.id = temp.parent_id 
	) SELECT
	* 
FROM
	temp

我们把儿子的 id 作为条件,查询来的结果作为递归的条件,去从它自身开始,递归 向上 找它的 父亲,以及父亲的父亲。这就是这句 SQL的翻译
在这里插入图片描述
这是我们想要的结果:

如果想通过 “顶级父类”,查看它下面的 子集也可以,我们稍微改动一下我们SQL

WITH recursive temp AS (
SELECT
	id,
	`name`,
	parent_id 
FROM
	person 
WHERE
	id = 1 UNION ALL
SELECT
	p.id,
	p.`name`,
	p.parent_id 
FROM
	person p,
	temp 
WHERE
	p.parent_id = temp.id 
	) SELECT
	* 
FROM
	temp

在这里插入图片描述
思考第一个问题:
就是我们每次查询这个链条的时候只能是保证单边查询,要是能向两边延展查询就好了,比如我们输入 父亲的id,最终的结果是:父亲、儿子、爷爷、都能找到,而不是每次得到是向上或者向下单边结果集

思考第二个问题:
既然这里也是递归,那么层级要是有一定深度的情况,SQL的速度怎么样?
我将数据扩大了10倍,增加到了30多条,相较于之前的3条,执行时间还是没怎么增加,多次执行,取平均值,都在350 ms左右
在这里插入图片描述

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

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

相关文章

测试开发工程师需要掌握什么技能?

测试开发工程师是软件开发中至关重要的角色之一。他们负责编写、维护和执行自动化测试脚本、开发测试工具和框架,以确保软件的质量和稳定性。为了成为一名优秀的测试开发工程师,你需要掌握以下技能: 1. 编程技能: 作为测试开发工…

java设计模式(七)适配器模式(Adapter Pattern)

1、模式介绍: 适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户希望的另外一个接口。适配器模式通常用于需要复用现有的类,但是接口与客户端的要求不完全匹配的情况。它包括两种形式&…

鸿蒙面试心得

自疫情过后,java和web前端都进入了冰河时代。年龄、薪资、学历都成了找工作路上躲不开的门槛。 年龄太大pass 薪资要高了pass 学历大专pass 好多好多pass 找工作的路上明明阳关普照,却有一种凄凄惨惨戚戚说不清道不明的“优雅”意境。 如何破局&am…

不用翻墙,手把手教你用MAC本地版免费ComfyUI搭建Stable Diffusion工作流,让出图效率起飞

AI绘图如火如荼发展了这么久,从mj到SD webUI,再到时下最热门的Comfy UI。因为显存的问题对Mac用户一直不是很友好,阻碍了大部分设计师上手学习的道路。但是Comflowy解决了这个痛点。这是一款Mac系统可用本地版的sd,一键安装,让苹果…

【Sklearn驯化-聚类指标】搞懂机器学习中聚类算法评估指标,轮廓系数、戴维森堡丁指数

【Sklearn驯化-聚类指标】搞懂机器学习中聚类算法评估指标,轮廓系数、戴维森堡丁指数 本次修炼方法请往下查看 🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地! &#…

OnlyOffice测评

官方链接: https://www.onlyoffice.com/zh/office-suite.aspx https://www.onlyoffice.com/zh/pdf-editor.aspx OnlyOffice:引领办公效率的新标杆 在数字化时代的浪潮中,办公软件已经成为我们日常工作中不可或缺的一部分。然而,…

马斯克的SpaceX星舰有多牛?我们离殖民火星还有多远?

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 埃隆马斯克是一位知名的企业家和工程师,他掌握着多家公司,涉及多个领域,包括电动汽车、太空探索、太阳能、脑…

入门JavaWeb之 Response 下载文件

web 服务器接收到客户端的 http 请求 针对这个请求,分别创建一个代表请求的 HttpServletRequest 对象,代表响应的 HttpServletResponse 对象 获取客户端请求过来的参数:HttpServletRequest 给客户端响应一些信息:HttpServletRe…

【LeetCode】五、哈希表相关:统计重复元素 + 找不同

文章目录 1、哈希表结构2、Java中的哈希表3、leetcode217:统计重复元素4、leetcode389:找不同5、leetcode496:下一个更大元素 1、哈希表结构 又叫散列表,存键值对,将key用哈希函数转为数组下标索引 当两个不同的key经…

多功能气象传感器的工作原理

TH-WQX9多功能气象传感器是一种集成了多种传感器技术的气象观测装置,旨在同时测量和监测大气中的多个气象要素,以提供全面、准确的气象信息。以下是关于多功能气象传感器的详细介绍: 技术原理 多功能气象传感器采用多种传感器技术相结合&…

[C++][设计模式][原型模式]详细讲解

1.动机 在软件系统中,经常面临这“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口如何应对这种变化?如何向“客户程序(使用这些对象的程序)”隔离出…

【FFmpeg】avformat_alloc_output_context2函数

【FFmpeg】avformat_alloc_output_context2函数 1.avformat_alloc_output_context21.1 初始化AVFormatContext(avformat_alloc_context)1.2 格式猜测(av_guess_format)1.2.1 遍历可用的fmt(av_muxer_iterate&#xff0…

正版软件 | DupInOut Duplicate Finder:智能清理,让数据井然有序

在信息爆炸的时代,我们经常面临数据管理的挑战。DupInOut Duplicate Finder 是一款专为Windows 设计的重复文件查找工具,帮您快速识别并删除重复的文档、音乐、视频和照片,让您的计算环境更加清洁、有序。 精准查找,一键删除 DupI…

DM达梦数据库转换、条件函数整理

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝&#x1f49…

硬件开发笔记(二十二):AD21软件中创建元器件AXK5F80337YG原理图库、封装库和3D模型

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/140007117 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

怎么扫描图片变成pdf格式?办公人士值得收藏的宝藏工具

将图片扫描并转换为PDF格式可以通过多种途径实现,无论是使用专业的扫描仪还是智能手机,都有相应的方法。 PDF 是什么? PDF,全称为 Portable Document Format(便携式文档格式),是由Adobe System…

使用宝塔安装ModstartCMS (非一键安装)

操作系统 Linux Windows 推荐 Linux 操作系统,性能比较好 软件环境 稳定版 PHP 5.6 PHP 7.0 MySQL >5.0 PHP Extension:Fileinfo Apache/Nginx Laravel 9.0 版本 PHP 8.1 MySQL >5.0 PHP Extension:Fileinfo Apache/Ngin…

DLS策略洞察:如何应对AI数据中心网络交换机市场的爆发式增长?

摘要: 随着AI技术的发展和应用,AI数据中心对网络交换机的需求日益增加。摩根士丹利预计,2023-2026年间,AI数据中心网络交换机的收入复合年增长率(CAGR)将达到55%。本文将详细分析AI数据中心网络交换机市场…

Springboot + Mybatis-Plus代码生成指南

使用 Spring Boot 和 MyBatis-Plus 生成代码&#xff0c;可以大大简化开发流程&#xff0c;可以保持编码的规范性&#xff0c;生成单元测试等。以下是详细步骤&#xff1a; 配置pom.xml <dependency><groupId>com.baomidou</groupId><artifactId>myb…

Arcgis 计算经纬度坐标并补齐6位小数

工作中我们经常需要在Arcgis中计算点的经纬度或者线的起点、终点坐标&#xff0c;为确保数据的准确性&#xff0c;我们必须保留6位小数&#xff0c;但我们在默认计算的时候偶尔会遇到算出来的经纬度坐标小数位不足6位&#xff0c;那我们应该如何补齐呢&#xff0c;这里我将方法…