当前位置: 首页 > news >正文

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…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

SpringCloudGateway 自定义局部过滤器

场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...