MySQL递归查询笔记
目录
一、创建表结构和插入数据
二、查询所有子节点
三、查询所有父节点
四、查询指定节点的根节点
五、查询所有兄弟节点(同级节点)
六、获取祖先节点及其所有子节点
七、查询每个节点之间的层级关系
八、查询指定节点之间的层级关系
一、创建表结构和插入数据
CREATE TABLE `region` ( `id` VARCHAR(36) NOT NULL DEFAULT (UUID()) COMMENT '主键', `parent_id` VARCHAR(36) COMMENT '父键', `name` VARCHAR(255) NOT NULL COMMENT '地区名', `latitude` DECIMAL(10, 6) COMMENT '经度', `longitude` DECIMAL(10, 6) COMMENT '纬度', PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;INSERT INTO `region` (`parent_id`, `name`, `latitude`, `longitude`)
VALUES (NULL, '江苏省', 31.2304, 120.663); SET @jiangsu_id = (SELECT `id` FROM `region` WHERE `name` = '江苏省'); INSERT INTO `region` (`parent_id`, `name`, `latitude`, `longitude`)
VALUES (@jiangsu_id, '苏州市', 31.2988, 120.5853); SET @suzhou_id = (SELECT `id` FROM `region` WHERE `name` = '苏州市'); INSERT INTO `region` (`parent_id`, `name`, `latitude`, `longitude`)
VALUES (@suzhou_id, '张家港市', 31.8754, 120.5553), (@suzhou_id, '吴中区', 31.2622, 120.6446), (@suzhou_id, '相城区', 31.3697, 120.646), (@suzhou_id, '吴江区', 31.1791, 120.6411); SET @zhangjiagang_id = (SELECT `id` FROM `region` WHERE `name` = '张家港市');
SET @wuzhong_id = (SELECT `id` FROM `region` WHERE `name` = '吴中区');
SET @xiangcheng_id = (SELECT `id` FROM `region` WHERE `name` = '相城区');
SET @wujiang_id = (SELECT `id` FROM `region` WHERE `name` = '吴江区'); INSERT INTO `region` (`parent_id`, `name`, `latitude`, `longitude`)
VALUES (@zhangjiagang_id, '凤凰镇', 31.8754, 120.5553), (@zhangjiagang_id, '塘桥镇', 31.8754, 120.5553); INSERT INTO `region` (`parent_id`, `name`, `latitude`, `longitude`)
VALUES (@wuzhong_id, '木渎镇', 31.2622, 120.6446); INSERT INTO `region` (`parent_id`, `name`, `latitude`, `longitude`)
VALUES (@xiangcheng_id, '黄埭镇', 31.3697, 120.646); INSERT INTO `region` (`parent_id`, `name`, `latitude`, `longitude`)
VALUES (@wujiang_id, '平望镇', 31.1791, 120.6411), (@wujiang_id, '黎里镇', 31.1791, 120.6411); INSERT INTO `region` (`parent_id`, `name`, `latitude`, `longitude`)
VALUES (@jiangsu_id, '无锡市', 31.5704, 120.3055); SET @wuxi_id = (SELECT `id` FROM `region` WHERE `name` = '无锡市'); INSERT INTO `region` (`parent_id`, `name`, `latitude`, `longitude`)
VALUES (@wuxi_id, '锡山区', 31.5887, 120.3573), (@wuxi_id, '惠山区', 31.6514, 120.3036), (@wuxi_id, '滨湖区', 31.5502, 120.2598), (@wuxi_id, '江阴市', 31.9086, 120.2855), (@wuxi_id, '宜兴市', 31.3623, 119.8233);
二、查询所有子节点
从指定的父节点开始,递归查找所有子级地区:
WITH RECURSIVE region_cte AS ( SELECT id, name, parent_id FROM region WHERE name = '苏州市' -- 根据指定父节点开始 UNION ALL SELECT r.id, r.name, r.parent_id FROM region r JOIN region_cte c ON r.parent_id = c.id -- 递归查找所有子地区
)
SELECT * FROM region_cte
查询结果:

三、查询所有父节点
从指定的子节点开始,递归查找所有父级地区:
WITH RECURSIVE region_cte AS ( SELECT id, name, parent_id FROM region WHERE name = '张家港市' -- 从指定子节点开始 UNION ALL SELECT r.id, r.name, r.parent_id FROM region r JOIN region_cte c ON r.id = c.parent_id -- 递归查找父级区域
)
SELECT * FROM region_cte
查询结果:

四、查询指定节点的根节点
可以通过递归查找父节点,最终筛选出根节点(即没有父节点的):
WITH RECURSIVE region_cte AS ( SELECT id, name, parent_id FROM region WHERE name = '张家港市' -- 从指定节点开始 UNION ALL SELECT r.id, r.name, r.parent_id FROM region r JOIN region_cte c ON r.id = c.parent_id -- 递归查找父级区域
)
SELECT * FROM region_cte
WHERE parent_id IS NULL -- 筛选根节点
查询结果:

五、查询所有兄弟节点(同级节点)
查找与指定节点同级的所有区域:
SELECT id, name, parent_id
FROM region
WHERE parent_id = (SELECT parent_id FROM region WHERE name = '张家港市') -- 获取同级父节点
AND name != '张家港市' -- 排除自身
查询结果:

六、获取祖先节点及其所有子节点
获取指定节点的祖先以及每个祖先的所有子节点:
WITH RECURSIVE region_ancestors AS ( SELECT id, name, parent_id FROM region WHERE name = '张家港市' -- 从指定节点开始查找祖先 UNION ALL SELECT r.id, r.name, r.parent_id FROM region r JOIN region_ancestors c ON r.id = c.parent_id -- 递归查找所有父级区域
),
region_children AS ( SELECT id, name, parent_id FROM region UNION ALL SELECT r.id, r.name, r.parent_id FROM region r JOIN region_children c ON r.parent_id = c.id -- 递归查找所有子级区域
)
SELECT * FROM region_ancestors
UNION
SELECT * FROM region_children
WHERE parent_id IN (SELECT id FROM region_ancestors) -- 获取所有祖先的子节点
查询结果:

七、查询每个节点之间的层级关系
返回每个地区的详细信息,包括其层级和路径:
WITH RECURSIVE region_tree (id, name, parent_id, level, path) AS ( -- 选择根节点,即没有父节点的区域 SELECT id, name, parent_id, 1 AS level, CAST(name AS CHAR(200)) AS path FROM region WHERE parent_id IS NULL UNION ALL -- 递归查找子区域 SELECT r.id, r.name, r.parent_id, rt.level + 1 AS level, CONCAT(rt.path, ' -> ', r.name) AS path FROM region r JOIN region_tree rt ON r.parent_id = rt.id
)
-- 查询结果
SELECT id, name, parent_id, level, path
FROM region_tree
ORDER BY id -- 根据需要排序
查询结果:

八、查询指定节点之间的层级关系
假设获取苏州市(或其他特定节点)的所有子节点及其层级结构
WITH RECURSIVE region_tree (id, name, parent_id, level, path) AS ( -- 选择指定节点作为根节点 SELECT id, name, parent_id, 1 AS level, CAST(name AS CHAR(200)) AS path FROM region WHERE name = '苏州市' -- 替换为你想要查询的节点名称 UNION ALL -- 递归查找子区域 SELECT r.id, r.name, r.parent_id, rt.level + 1 AS level, CONCAT(rt.path, ' -> ', r.name) AS path FROM region r JOIN region_tree rt ON r.parent_id = rt.id
)
-- 查询结果
SELECT id, name, parent_id, level, path
FROM region_tree
ORDER BY level, id -- 根据层级和 ID 排序
查询结果:

相关文章:
MySQL递归查询笔记
目录 一、创建表结构和插入数据 二、查询所有子节点 三、查询所有父节点 四、查询指定节点的根节点 五、查询所有兄弟节点(同级节点) 六、获取祖先节点及其所有子节点 七、查询每个节点之间的层级关系 八、查询指定节点之间的层级关系 一、创建表…...
java中的位运算
位运算是对整数的二进制位进行操作的一种运算。在java中long, int, short, char和byte类型都可以使用位运算。 位运算的过程如下:首先将十进制整数转换成二进制表示形式,然后将位运算符应用于每个二进制数位,并计算结果。最后,将…...
llamafactory0.9.0微调qwen2vl
LLaMA-Factory/data/README_zh.md at main hiyouga/LLaMA-Factory GitHubEfficiently Fine-Tune 100+ LLMs in WebUI (ACL 2024) - LLaMA-Factory/data/README_zh.md at main hiyouga/LLaMA-Factoryhttps://github.com/hiyouga/LLaMA-Factory/blob/main...
Electron 隐藏顶部菜单
隐藏前: 隐藏后: 具体设置代码: 在 main.js 中加入这行即可: // 导入模块 const { app, BrowserWindow ,Menu } require(electron) const path require(path)// 创建主窗口 const createWindow () > {const mainWindow ne…...
软件测试学习笔记丨curl命令发送请求
本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/32332 一、简介 cURL是一个通过URL传输数据的,功能强大的命令行工具。cURL可以与Chrome Devtool工具配合使用,把浏览器发送的真实请求还原出来,附带认证信…...
STM32+PWM+DMA驱动WS2812 —— 2024年9月24日
一、项目简介 采用STM32f103C8t6单片机,使用HAL库编写。项目中针对初学者驱动WS2812时会遇到的一些问题,给出了解决方案。 二、ws2812驱动原理 WS2812采用单线归零码的通讯方式,即利用高低电平的持续时间来确定0和1。这种通信方式优点是只需…...
MMD模型及动作一键完美导入UE5-IVP5U插件方案(二)
1、下载并启用IVP5U插件 1、下载IVP5U插件, IVP5U,点击Latest下载对应引擎版本,将插件放到Plugins目录,同时将.uplugin文件的EnableByDefault改为false 2、然后通过Edit->Plugins启用插件 2、导入pmx模型 1、直接在Content的某个目录拖入pmx模型,选择默认参数 2、…...
C++函数指针
函数指针是将一个函数赋值给一个变量的方法 我们使用函数的方法,可能会给函数传入参数,或者传入参数,函数可能有返回值,也可能没有返回值(void) 下面这个例子,我们调用了HelloWorld函数 auto关…...
汽车信息安全 -- 再谈车规MCU的安全启动
目录 1. 安全启动流程回顾 1.1 TC3xx的安全启动 1.2 RH850的安全启动 1.3 NXP S32K3的安全启动 1.4 小结 2.信任链的问题 3.国产HSM IP的拓展 今天接着 汽车信息安全 -- 存到HSM中的密钥还需包裹吗?-CSDN博客这篇文章深究另一个重要功能-- 安全启动。 该文章…...
[Linux]从零开始的Linux的远程方法介绍与配置教程
一、为什么需要远程Linux 相信大家在学习Linux时,要么是使用Linux的虚拟机或者在物理机上直接安装Linux。这样确实非常方便,我们也能直接看到Linux的桌面或者终端。既然我们都能直接看到终端或者Linux的桌面了,那我们为什么还要远程Linux呢&a…...
手机改IP地址怎么弄?全面解析与操作指南
在当今数字化时代,IP地址作为设备在网络中的唯一标识,其重要性不言而喻。有时候,出于隐私保护、网络访问需求或其他特定原因,我们可能需要更改手机的IP地址。然而,对于大多数普通用户来说,如何操作可能还是…...
【React】useState 和 useRef:项目开发中该如何选择
如果你正踏入用 React 进行网页开发的世界,那你可能已经遇到了像 useState 和 useRef 这样的术语。这两个 Hook 在构建交互性和动态组件时起着至关重要的作用。 下面,我们将探讨它们是什么,它们的功能,它们的区别,并通…...
python装饰器用法
为什么用装饰器? 第一个原因是,使用装饰器可以提升代码复用,避免重复冗余代码。如果我有多个函数需要测量执行时间,我可以直接将装饰器应用在这些函数上,而不是给多个函数加上一样的代码。这样的代码既元余也不方便后…...
AI 写作太死板?原因竟然是这个!
有些同学跟我埋怨说AI生成的文章太死板,一堆的“首先、其次、然后、再次、接着、总而言之……”,说话太官方,内容还很水。 想要让它模仿谁的语气,或者谁的文章,一点儿都不像。 名人都不模仿不了,更别说模…...
ansible实用模块
简介 ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。…...
【JavaScript】JIT
JIT实际上指,JS的编译过程、运行时。 Just in Time 在传统的编译语言里,比如JAVA、Go等,是提前编译的,它们的执行是先在本地编译出一个"东西",然后在放到服务器上运行。 提前编译的三大过程: …...
Matlab实现麻雀优化算法优化回声状态网络模型 (SSA-ESN)(附源码)
目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 麻雀搜索算法(Sparrow Search Algorithm, SSA)是一种新兴的群体智能优化算法,灵感来源于麻雀的觅食行为及其在面临危险时的预警机制。SSA通过模拟麻雀的这些自然行为来寻找问题…...
从 TCP Reno 经 BIC 到 CUBIC
重读 TCP拥塞控制算法-从BIC到CUBIC 以及 cubic 的 tcp friendliness 与拐点控制 这两篇文章,感觉还是啰嗦了,今日重新一气呵成这个话题。 reno 线性逼近管道容量 Wmax,相当于一次查询(capacity-seeking),但长肥管道从 0.5*Wmax …...
工厂模式与建造者模式的区别
在软件设计中,工厂模式和建造者模式是两种常见的设计模式,它们都是用于创建对象,但是各自有不同的应用场景和目的。本文将通过餐馆点餐的例子,深入探讨这两种模式的区别。 工厂模式 工厂模式的核心思想是通过一个抽象工厂类来创…...
电脑usb接口封禁如何实现?5种禁用USB接口的方法分享!(第一种你GET了吗?)
“防患于未然,安全始于细节。”在信息技术飞速发展的今天,企业的信息安全问题日益凸显。 USB接口作为数据传输的重要通道,在带来便利的同时,也成为了数据泄露和安全风险的高发地。 因此,对电脑USB接口进行封闭管理&a…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...
