MySql递归RECURSIVE的详解

article/2025/8/25 2:33:02

背景:

在实际开发的过程中,我们会遇到一些数据是层级关系的、要展示数据子父级关系的时候,
第一个解决方案:将数据库中的所有数据都查询出来用Java代码进行处理。
第二个解决方案:可以考虑MySql中的RECURSIVE递归进行数据的查询。
具体选择什么样的方法去实现,结合自己项目需求考虑。

目前有这样的一张关系属性表:
在这里插入图片描述

需求1 :找到名字为“隔壁老王”所有的后代(父查子)

	-- 递归找出隔壁老王所有的后代(父找子)WITH RECURSIVE temp(ID,USERNAME,PID,pName) AS (-- 将结果表命名为temp-- 查询出父id这条记录,此时这条记录已存在temp表中	SELECT  KI.ID,KI.NAME,KI.PID, KI.NAME FROM KINSHIP_INFO KI WHERE KI.`NAME`= '隔壁老王'UNION ALL/*ps:下面这条sql是获取的期望结果中的后两条记录(不包含第一条)*注意where后的条件,我们使用temp表中的唯一一条记录的id关联KINSHIP_INFO表中的pid*仅当temp第一条记录匹配不到KINSHIP_INFO表中的pid时才会对temp的第二条记录id进行匹配*/SELECT K.ID,K.NAME,temp.ID,temp.username pName FROM temp, KINSHIP_INFO K WHERE temp.ID = K.PID)SELECT * FROM temp

查询出来的最终结果即是期望的结果。如下图所示
在这里插入图片描述

需求2 :递归找出最小层级所有的父级(子查父)

思路分析:最小层级是孙子,即先从表中所有的grade字段最大的,然后通过这些最小层级递归往上找他们所有的长辈。

		-- 递归找出每一层下面的最小层级(子查父)WITH RECURSIVE  TEMP(ID,USERNAME,PID,childId,childName) AS (-- 查中表中最所有的辈分最小(即grade值最大)的信息,此时查询的信息会存到tem表中SELECT  KI.ID,KI.NAME,KI.PID,KI.ID childId,KI.NAME childName FROM KINSHIP_INFO KI WHERE ki.grade= (SELECT max(grade) as grade FROM KINSHIP_INFO )-- 这里还可以添加过滤条件,比如:我只想找王阿姨孙子的及其所有的长辈,不要隔壁老王相关的人。-- AND KI.ID = 4UNION ALL/*ps:下面这条sql是获取的期望结果中的后两条记录(不包含第一条)*注意where后的条件,我们使用temp表中的唯一一条记录的PID关联KINSHIP_INFO表中的id*仅当temp第一条记录匹配不到KINSHIP_INFO表中的id时才会对temp的第二条记录PID进行匹配*/SELECTK.ID,K.NAME,K.PID,TEMP.childId,TEMP.childName FROMTEMP,KINSHIP_INFO K WHERETEMP.PID = K.ID)SELECT * FROM TEMP

查询的结果如下图所示
在这里插入图片描述

扩展:用RECURSIVE 计算1~100累加后的值

WITH RECURSIVE NUMBERINFO(N) AS ( -- 为结果表,N为字-- 递归开始的第一条记录,只要这个这条语句一执行,就会将第一条记录了的结果存储到NUMBERINFO这种表中,此时可以理解为NUMBERINFO只有一条记录SELECT 1 FROM DUAL UNION ALLSELECT N+1 FROM NUMBERINFO WHERE N < 100    /*这里产生的结果为 2  ,此时NUMBERINFO表的字段n有两条记录分别为1,2* 其他以此类推*				  3*                 ...*                 100*/																				 
)
SELECT SUM(N) FROM NUMBERINFO; 

最终计算的结果为:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/kUUiB6J6.shtml

相关文章

【MYSQL WITH recursive使用】

MYSQL WITH recursive使用 MYSQL WITH recursive使用语法用法1&#xff1a;输出1~n或者求 1~n的和用法2 父求子创建table&#xff1a;user求张三后代 MYSQL WITH recursive使用 由于在项目中有使用到recursive&#xff0c;因此在此做记录 语法 WITH recursive 表名 AS ( 初始…

U 盘安装 CentOS7 时盘符和安装源不可用问题

记录一次在物理机上安装 CentOS7 遇到的问题及其解决办法&#xff0c;主要有两个问题卡住了很久&#xff0c;一个是盘符问题&#xff0c;一个就是安装源不可用的问题 。 1 No such device 1.1 问题描述 用 U 盘在物理机上安装 CentOS7 的时候&#xff0c;出现 could not ins…

Vmware Workstation17 安装centos7(详细教程)

1、为什么安装Vmware Vmware Workstation可以帮我们他们创建虚拟机&#xff0c;模拟生产环境(linux)&#xff0c;搭建集群等。作为一个开发人员特别是后端开发人员是需要懂一些运维的&#xff0c;不需要精通&#xff0c;遇到问题能定位排查。我自己想做一个自己的项目&#xf…

用大白菜装centos7_大白菜安装centos7 踩坑记

1.准备一个U盘,安装大白菜。这个去大白菜官网下载安装就可以了 安装大白菜的时候最好选择FAT32(2021.1.7记录) 2.U盘装完大白菜后U盘会被分为两个主分区 一个盘是大白菜系统的,另外一个盘放一些工具的。 DBC里面就是放的一些工具 比如磁盘管理工具 3.把Centos7的镜像放入到DB…

Windows10安装Centos7双系统

Windows10安装Centos7双系统 1.摘要2.制作Centos 7系统盘3.Windows磁盘管理为Centos系统留出空间4.bios配置使得计算机系统选择从U盘进入5.安装Centos 7系统6.如何在Windows和Centos系统间切换7.一些问题与补救方法8.参考文章 1.摘要 本篇博客主要整理记录了在Win10 OS下安装使…

VM16上安装CentOS7详细安装教程【附图】

在VM16上安装Centos7 下载Centos安装Centos快照拍摄 下载Centos 进入Centos官网 Centos官网的下载地址 点击Download 点击x86_64 自己选择镜像下载 上面选择好自己的镜像后选择后缀名为 iso 的CentOS下载 安装Centos 点击创建新的虚拟机 选择好自定义后点击下一步…

VMware 16安装centos 7详细教程

VMware 16安装centos 7详细教程 前言&#xff1a;之前在VMware15 pro上安装centos7&#xff0c;但是启动虚拟机出现蓝屏&#xff0c;身边有好多小伙伴也遇到了这个问题&#xff0c;经过一番排查&#xff0c;找到了最简单的办法就是升级到VMware16pro&#xff0c;在启动就没有出…

在Vmware虚拟机中安装CentOS 7

前言&#xff1a;材料和工具 1. 安装好的VMWare虚拟机软件&#xff1a; ​VMWare16下载地址&#xff0c;获取码&#xff1a;ye1a 2.CentOS7下载地址&#xff1a;官方镜像下载 (centos.org) &#xff08;官方镜像站下载比较慢&#xff09; 清华大学镜像站&#xff1a;清华…

物理服务器安装CentOS 7操作系统

目录 1、下载系统镜像 2、制作安装盘 2.1 方法一&#xff1a;光盘制作 2.2 方法二&#xff1a;U盘制作 3、更改bios启动顺序 4、安装CentOS 7操作系统 4.1 安装命令选择&#xff0c;及常见错误解决 4.2 语言选择 4.3 时区选择 4.4 软件选择 4.5 安装位置选择 4.6 手…

M1芯片Macbook虚拟机安装centos7

目录 一、安装parallels Desktop、centos7 二、安装Parallels Tools 三、安装VNC server服务 四、进程占用问题 一、安装parallels Desktop、centos7 由于centon7内核版本问题用PD18等版本安装centos7进入默认是命令行安装。 命令界面安装&#xff1a; 1、选数字5 回车 再…

虚拟机安装centos7

1、简介 这里虚拟机采用VMware15.1.0&#xff0c;镜像采用CentOS7版本&#xff0c;官网或国内镜像可直接下载。 https://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso 2、安装流程 1、打开vmware软件&#xff0c;点击 创建新的虚拟机。 2、选择 典…

Mac(2) Parallels Desktop 安装 CentOS7

文章目录 一、前言二、准备三、Parallels Desktop安装CentOS7四、CentOS7配置1、网络配置 -- 设置固定ip2、关闭防火墙3、关闭SELinux4、更新yum源5、安装ifconfig6、其它 一、前言 本文将通过Parallels Desktop安装CentOS7 二、准备 Parallels Desktop下载安装 https://www…

vm安装centos7蓝屏

vm安装centos7蓝屏 最近有同学购买了最新款英特尔11代的笔记本&#xff0c;使用vm安装centos7系统&#xff0c;一启动虚拟机就系统蓝屏&#xff0c;今天给后来的同学们找一下坑吧。 系统&#xff1a;最新版win10 软件&#xff1a;vm16.0 链接&#xff1a;【百度云】 提取码&am…

Docker 安装 CentOS7

Docker 安装 CentOS 前言一、查看可用的 CentOS 版本二、安装1、拉取指定版本的 CentOS 镜像&#xff0c;这里我们安装指定版本为例(centos7):2、查看本地镜像&#xff0c;验证是否安装成功2、运行容器3、进入到Centos容器4.安装ssh服务和网络必须软件A、安装完后重启SSH服务:B…

Mac M1安装Centos7

一、安装PD虚拟机 地址&#xff1a;https://macwk.com/soft/parallels-desktop-for-arm 二、下载centos (arm64)镜像 地址&#xff1a;https://www.aliyundrive.com/s/ZGVA2Mfkm2q 提取码: 4b9d **注意&#xff1a;**因网盘分享文件类型限制&#xff0c;这里下载镜像后需要把…

图解VirtualBox安装CentOS 7

VirtualBox简介 VirtualBox是由德国InnoTek软件公司出品的虚拟机软件&#xff0c;现在则由甲骨文公司进行开发&#xff0c;是甲骨文公司xVM虚拟化平台技术的一部分。 VirtualBox提供用户在32位或64位的Windows、Solaris及Linux 操作系统上虚拟其它x86的操作系统。用户可以在V…

CentOS 7系统安装配置图解教程

操作系统&#xff1a;CentOS 7.3 备注&#xff1a; CentOS 7.x系列只有64位系统&#xff0c;没有32位。生产服务器建议安装CentOS-7-x86_64-Minimal-1611.iso版本 一、安装CentOS 7.3 成功引导系统后&#xff0c;会出现下面的界面 界面说明&#xff1a; Install CentOS 7 #安装…

CentOS7系统安装步骤详解

前言 CentOS7各版本系统安装过程基本一致&#xff0c;本文使用CentOS7.5镜像进行系统安装&#xff0c;希望对广大读者有所帮助&#xff01; 一、虚拟机软件 常用的虚拟机软件&#xff1a;windows系统常用VMware workstation、Virtual box等软件&#xff0c;macOS系统建议使用…

CentOS7的安装(详细)

一、Vmware安装 二、CentOS安装 1、下载CentOS7 阿里的镜像&#xff1a; 2、点击创建虚拟机 3、接下来根据提示来完成建议的步骤 这一步点击自定义硬件&#xff0c;不点击完成 在自定义硬件中选择使用ISO映像文件配置完成后&#xff0c;点击确定&#xff0c;如果不配置这一步…

CentOS 7 安装教程

CentOS 7 安装教程 第一步&#xff1a;选择Install CentOS7来进行安装 第二步&#xff1a;选择安装语言&#xff0c;建议选择English&#xff0c;然后点击继续 第三步&#xff1a;依次进行 [软件选择]和[分区操作] 3.1、软件安装选择&#xff0c;刚开始建议选择GNOME桌面&am…