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 排序

查询结果:

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

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

相关文章

Docker配置阿里云镜像加速器,拉取Tomcat,使用云服务器访问Tomcat容器

一、简介与概述 1.Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 2. Doc…

数据结构编程实践20讲(Python版)—03栈

本文目录 03 栈 StackS1 说明S2 示例基于列表的实现基于链表的实现 S3 问题:复杂嵌套结构的括号匹配问题求解思路Python3程序 S4 问题:基于栈的阶乘计算VS递归实现求解思路Python3程序 S5 问题:逆波兰表示法(后缀表达式)求值求解思路Python3程…

华为GaussDB数据库之Yukon安装与使用

一、Yukon简介 Yukon(禹贡),基于openGauss、PostgreSQL、GaussDB数据库扩展地理空间数据的存储和管理能力,提供专业的GIS(Geographic Information System)功能,赋能传统关系型数据库。 Yukon 支…

Go基础编程 - 15 - 延迟调用(defer)

延迟调用 defer 1. 特性2. 常用用途3. defer 执行顺序:同函数内先进后出4. defer 闭包5. defer 陷阱 上一篇:泛型 1. 特性 1. 关键字 defer 用于注册延迟调用。 2. defer 调用直到 return 前才被执行。 3. 同函数内多个 defer 语句,按先进后…

怎么绕开华为纯净模式安装软件

我是标题 众所周不知,华为鸿蒙系统自带纯净模式,而且 没法关闭 : ) 我反正没找到关闭键 以前或许会有提示,无视风险,“仍要安装”。但我这次遇到的问题是,根本没有这个选项,只有“应用市场”和“取消”&…

数据结构:二叉树的遍历和线索二叉树

二叉树的遍历 二叉树的遍历是二叉树的一种重要的操作,指按照某种顺序访问树中的每个节点,并且每个节点仅被访问一次。常见的遍历方式有四种:前序遍历、中序遍历、后序遍历和层次遍历(或称为广度优先遍历)。 二叉树的…

物联网系统中LCD屏主流驱动方案详解

01 物联网系统中为什么要使用LCD驱动芯片 在物联网系统中使用LCD驱动芯片的原因主要有以下几点: 节省资源 1、减少IO端口占用:在物联网设备中,单片机或其他主控芯片的IO资源通常非常有限。LCD驱动芯片可以通过简单的接口(如SP…

基于Hive和Hadoop的白酒分析系统

本项目是一个基于大数据技术的白酒分析系统,旨在为用户提供全面的白酒市场信息和深入的价格分析。系统采用 Hadoop 平台进行大规模数据存储和处理,利用 MapReduce 进行数据分析和处理,通过 Sqoop 实现数据的导入导出,以 Spark 为核…

jenkins项目发布基础

随着软件开发需求及复杂度的不断提高,团队开发成员之间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题。Jenkins 自动化部署可以解决集成、测试、部署等重复性的工作,工具集成的效率明显高于人工操作;并且持续集成可以更早的获取代码变更的信息,…

从Linux系统的角度看待文件-基础IO

目录 从Linux系统的角度看待文件 系统文件I/O open write read 文件操作的本质 vim中批量注释的方法 从Linux系统的角度看待文件 关于文件的共识: 1.空文件也要占用磁盘空间 2.文件内容属性 3.文件操作包括文件内容/文件属性/文件内容属性 4.文件路径文…

【Qt】前后端交互---DataCenter类

设计目的 前后端交互系统中,创建并使用数据核心类的目的就是让该类作为客户端的数据中心,也就是说其负责管理客户端的所有数据与服务器的网络通信。 数据持久化 初始化数据文件 该函数设计的目的就是用于检查所需要的文件和目录是否存在,如…

短视频矩阵系统源码开发/矩阵系统OEM搭建--源代码开发经验分享

短视频矩阵系统开发策略 短视频矩阵系统源码的原生开发方法 一、基于原生技术的短视频矩阵系统开发途径 原生编程语言:采用各平台专有的编程语言及开发工具,如iOS平台的Swift或Objective-C,以及平台的Java或Kotlin,确保应用性能与…

[贪心+数学/数学+位运算] 两种方法O(1)解决 消减整数

标题:[贪心数学/数学位运算] 两种方法O(1)解决 消减整数 个人主页水墨不写bug 目录 一、题目:消减整数(Newcoder) 二、题目分析 1.理解题意: 2.解决问题 解法详解一:贪心数学 解法一参考代码: 解法详解二&#xf…

WiFi无线连接管理安卓设备工具:WiFiADB

介绍 WiFi ADB 使您能够通过 WiFi TCP/IP 连接直接在设备上轻松调试和测试 Android 应用,无需使用 USB 数据线。在启用 WiFi 上的 ADB 后,打开控制台将电脑连接到设备。 手机和电脑在同一个WiFi然后电脑上运行adb connect x.x.x.x:x命令即可 下载 谷…

MindSearch 部署到Github Codespace 和 Hugging Face Space

和原有的CPU版本相比区别是把internstudio换成了github codespace。 教程是https://github.com/InternLM/Tutorial/blob/camp3/docs/L2/MindSearch/readme_github.md 复现步骤: 根据教材安装环境和创建硅基流动 API 然后启动前后端 然后按照教材部署到 Huggi…

一站式家装服务管理系统

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本一站式家装服务管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数…

基于Hive和Hadoop的病例分析系统

本项目是一个基于大数据技术的医疗病历分析系统,旨在为用户提供全面的病历信息和深入的医疗数据分析。系统采用 Hadoop 平台进行大规模数据存储和处理,利用 MapReduce 进行数据分析和处理,通过 Sqoop 实现数据的导入导出,以 Spark…

《征服数据结构》哈夫曼树(Huffman Tree)

摘要: 1,哈夫曼树的介绍 2,哈夫曼树的构造 3,哈夫曼树带权路径长度计算 4,哈夫曼树的编码 5,哈夫曼树的解码 1,哈夫曼树的介绍 哈夫曼树(Huffman Tree)也叫霍夫曼树,或者赫夫曼树&am…

学校周赛(1)

A - Short Sort 题目: 思路: 本条题目只允许改一处地方,只有三个字母,我们可以直接枚举所有移动过的结果,同时使用哈希去记录其值,对于每一个输入我们都寻找是否有这个值记录,有则输出YES否则…

微深节能 环形运动机械定位控制系统 格雷母线

微深节能的环形运动机械定位控制系统中的格雷母线,是一种高精度、无磨损的非接触式位置检测系统,特别适用于环形运动机械的定位控制。该系统主要由格雷母线、天线箱、电气柜等关键部件组成,其核心在于格雷母线这一特殊的编码线。 格雷母线概述…