MySQL递归查询(with recursive)

news2024/11/18 3:24:13

背景

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

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

在这里插入图片描述
建了一张很容易理解阶级的表,一目了然
很多时候我们的需求就是,通过任何一个人的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,最终的结果是:父亲、儿子、爷爷、都能找到

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

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

相关文章

仓库管理系统09--修改用户密码

1、添加窗体 2、窗体布局控件 UI设计这块还是传统的表格布局&#xff0c;采用5行2列 3、创建viewmodel 4、前台UI绑定viewmodel 这里要注意属性绑定和命令绑定及命令绑定时传递的参数 <Window x:Class"West.StoreMgr.Windows.EditPasswordWindow"xmlns"http…

缓存问题二、缓存雪崩

缓存雪崩 缓存雪崩&#xff1a;是指在同一时段大量的缓存key同时失效或者Redis服务宕机&#xff0c;导致大量请求到达数据库&#xff0c;带来巨大压力。 缓存雪崩的解决方案&#xff1a; 给不同的Key的TTL添加随机值利用Redis集群提高服务的可用性给缓存业务添加降级限流策略…

转行AI产品经理,这些“门槛”你得先迈过!

前言 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;AI产品经理这一岗位逐渐崭露头角&#xff0c;成为许多追求创新和挑战的职业人士的新选择。但转行并非易事&#xff0c;特别是进入到一个全新的领域。在决定踏上AI产品经理这条道路之前&#xff0c;以下…

HarmonyOS角落里的知识:“开发应用沉浸式效果”

概述 典型应用全屏窗口UI元素包括状态栏、应用界面和底部导航条。开发应用沉浸式效果主要指通过调整状态栏、应用界面和导航条的显示效果来减少状态栏导航条等系统界面的突兀感&#xff0c;从而使用户获得最佳的UI体验。 图1 界面元素示意图 开发应用沉浸式效果主要要考虑如下…

win7 的 vmware tools 安装失败

没有安装vmware tools的系统屏幕显示异常。桌面是比较小的图像&#xff0c;四周是黑边在 vmware 软件里 方法1&#xff0c;下补丁 https://www.catalog.update.microsoft.com/Search.aspx?qkb4474419 方法2&#xff0c;使用老版vm tools http://softwareupdate.vmware.com/c…

全视通智慧医院解决方案助力“以旧换新”的医疗升级!

全视通表示&#xff0c;以旧换新的本质更多的是医院综合性能的提升&#xff0c;应该通过从顶层设计规划&#xff0c;全面提升医院的整体运营水平&#xff0c;改善患者及医护对医院的满意度、提升医护整体效率&#xff0c;同时实现医院复合手术室、实验室、ICU等医院重点空间的需…

第十一次作业

1.过滤器用的Interceptor因为idea中自带的拦截器 ReaderInterceptor import request from /utils/requestexport function fetchList(query) {return request({url: /vue-element-admin/article/list,method: get,params: query}) }export function fetchArticle(id) {return…

Lua博客网站支持搜索、评论、登录注册

该简易博客示例用于学习网站的基础知识与MySQL数据库。 简述&#xff1a;开源Lua网站开发服务(FastWeb)支持&#xff1a;注册、登录、文章分页、评论分页、简易权限管理和搜索功能。发帖功能支持Markdown(支持记忆功能)图示&#xff1a;

DOM遍历

DOM 遍历是指在 HTML 文档中导航和定位元素的过程。通过 DOM 遍历&#xff0c;您可以在文档中移动并查找特定的元素&#xff0c;以便对其进行操作或者检索信息。 寻找子元素 //DOM遍历 const h1 document.querySelector(h1);//寻找子元素 console.log(h1.querySelectorAll(.…

数据恢复篇:如何恢复丢失的Android短信?

许多用户发现自己处于重要短信意外从Android手机中删除的情况。幸运的是&#xff0c;有一些行之有效的方法可以在没有root的情况下恢复已删除的短信Android&#xff0c;这可以成为救命稻草。这些技术不需要深厚的技术知识&#xff0c;也不需要损害设备的安全性。为了帮助您摆脱…

驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法

在连接数据库的时候出现了下面图面中的错误&#xff0c;尝试集中方法后终于解决了这个问题。 1.修改驱动程序版本 出现这种错误可能是因为你的驱动程序版本不兼容&#xff0c;我们可以尝试修改版本解决。而我们的驱动程序往往是以依赖的形式导入&#xff0c;因此可以在maven仓…

iOS17系统适配

iOS17 新功能 文章目录 iOS17 新功能iOS17支持哪几款机型Xcode15新特性iOS17-开发适配指南 横屏待机 在iOS 17中&#xff0c;还带来了横屏待机功能&#xff0c;苹果将这个新功能命名为“Standby”模式&#xff0c;为 iPhone 带来了全新的玩法。iPhone启用之后&#xff0c;默认情…

Purple Pi OH固件的芯片信息识别问题说明

本文适用于在Purple Pi OH固件的芯片信息识别问题说明。触觉智能的Purple Pi OH鸿蒙开源主板&#xff0c;是华为Laval官方社区主荐的一款鸿蒙开发主板。 该主板主要针对学生党&#xff0c;极客&#xff0c;工程师&#xff0c;极大降低了开源鸿蒙开发者的入门门槛&#xff0c;具…

每日一题——Python实现PAT乙级1030 完美数列(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 初次尝试 再次尝试 代码结构 时间复杂度分析 空间复杂度分析 总结 我要更强 时…

初阶 《操作符详解》11. 下标引用、函数调用和结构成员

11. 下标引用、函数调用和结构成员 1. [ ] 下标引用操作符 操作数&#xff1a;一个数组名 一个索引值 int arr[10];//创建数组 arr[9] 10;//实用下标引用操作符&#xff0c;[ ]的两个操作数是arr和9arr[7]-->*(arr7)-->*(7arr)-->7[arr] 7[arr] 9; //编译器不会…

Wordpress图像编辑插件-palleon v3.8.1中文版语言包

Palleon是一个强大的WordPress图像编辑器&#xff0c;可以与您的WordPress网站无缝集成&#xff0c;让您快速高效地工作。它拥有为你的WordPress网站创建令人惊叹的图像所需的一切。 Palleon让您完全控制图像&#xff0c;允许您逐个像素进行更改。您可以轻松地裁剪、调整图像大…

java swing jtable显示数据库记录

代码&#xff0c; import java.awt.Container; import java.awt.Color; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.swing.*; import javax.swing.tabl…

Ubuntu+Apache2 搭建Gerrit 环境

一、前言 时隔多年&#xff0c;好久没有更新CSDN 博客了&#xff0c;主要原因有如下两点&#xff1a; 1、平时工作繁忙&#xff0c;无暇更新。 2、工作内容涉及信息安全&#xff0c;一些工作经验积累不便更新到互联网上。 最近一直在折腾搭建Gerrit 环境&#xff0c;最开始是…

百威英博旗下知名啤酒品牌Jupiler,创意助力比利时国足角逐欧洲杯冠军!

怎么说呢&#xff1f;今天非常开心。 因为今天分享的这个品牌创意案例很特别&#xff0c;和夏天、足球有关&#xff0c;和梦想、啤酒有关&#xff0c;还和QR Tiger 、二维彩虹有关。而把这一切连接在一起的&#xff0c;是一个小小的二维码。 这个夏天&#xff0c;百威英博旗下…

怎么新建百度词条

新建百度词条是一个分步骤的过程&#xff0c;需要遵循一定的规则和流程。以下是百科参考网shaoshai整理详细的步骤&#xff1a; 点击输入图片描述&#xff08;最多30字&#xff09; 怎么新建百度词条 1. 注册百度账号 在创建百度词条之前&#xff0c;您需要先注册一个百度账号…