MySQL递归查询笔记

news2024/11/18 11:30:26

目录

一、创建表结构和插入数据

二、查询所有子节点

三、查询所有父节点

四、查询指定节点的根节点

五、查询所有兄弟节点(同级节点)

六、获取祖先节点及其所有子节点

七、查询每个节点之间的层级关系

八、查询指定节点之间的层级关系


一、创建表结构和插入数据

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.coloradmin.cn/o/2175440.html

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

相关文章

一款辅助渗透测试过程,让渗透测试报告一键生成

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

动态顺序表的增删改查(数据结构)

目录 一、顺序表 二、静态顺序表 三、动态顺序表 3.1、动态顺序表的实现 3.2、动态顺序表的实现 3.3.1、结构体创建 3.3.2、初始化 3.3.3、销毁数据 3.3.4、增容空间 3.3.5、尾插数据 3.3.6、头插数据 3.3.7、删除尾数据 3.3.8、打印数据 3.3.9、删除头数据 3.3…

设备管理系统-TPM(PC+APP/PDA全流程)高保真Axure原型 源文件分享

随着科技的不断发展,企业对于设备管理的需求也日益增强。为了满足企业在设备管理方面的各种需求,站长为大家整理了一套设备管理系统TPM(PCAPP/PDA全流程)高保真Axure原型,通过这套原型,企业能够实现对设备的…

TDSQL-C电商小助手,AI驱动的智能化数据洞察新纪元

前言: 在数字经济蓬勃发展的今天,电商行业作为数字化转型的先锋,正以前所未有的速度积累着海量数据。这些数据不仅是交易记录的简单堆砌,更是企业洞察市场趋势、优化运营策略、提升用户体验的宝贵财富。然而,如何从这…

【2024.9.28练习】青蛙的约会

题目描述 题目分析 由于两只青蛙都在跳跃导致变量多,不妨采用物理题中的相对运动思想,设青蛙A不动,青蛙B每次跳米,两只青蛙的距离为米。正常来说,只要模拟青蛙B与青蛙A的相对运动过程,最终当青蛙B与青蛙A距…

Goweb---Gorm操作Mysql数据库(一)

本文重点: db.AutoMigrate()这个函数的理解: AutoMigrate是GORM提供的一个方法,用于自动迁移你的模型(即数据库表结构)到数据库中,确保数据库表与你的Go结构体(模型)保持一致。 首先…

第十四届蓝桥杯真题Python c组D.平均(持续更新)

博客主页:音符犹如代码系列专栏:蓝桥杯关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 【问题描述】 有一个长度为n的数组(n是10的倍数),每个数 …

vscode配置Eslint后保存出现大量波浪线

解决问题:配置代码格式化 快捷键打开设置:ctrlshiftP 输入: format code 选择:

MySQL-数据库约束

1.约束类型 类型说明NOT NULL非空约束 指定非空约束的列不能存储NULL值 DEFAULT默认约束当没有给列赋值时使用的默认值UNIQUE唯一约束指定唯一约束的列每行数据必须有唯一的值PRIMARY KEY主键约束NOT NULL和UNIQUE的结合,可以指定一个列霍多个列,有助于…

qt6 使用QPSQL

qt6 自带pg数据库驱动: pro文件加个说明: 引用位置添加(按需添加,这里我就大致加一下): test code: 理想情况当然是要用pool,这里只是演示调用而已 QSqlError DbTool::testConnection(const QString &…

LSTM预测未来30天销售额

加入深度实战社区:www.zzgcz.com,免费学习所有深度学习实战项目。 1. 项目简介 本项目旨在利用深度学习中的长短期记忆网络(LSTM)来预测未来30天的销售额。LSTM模型能够处理时序数据中的长期依赖问题,因此在销售额预测这类涉及时…

19款奔驰E300升级新款触摸屏人机交互系统

《19 款奔驰 E300 的科技焕新之旅》 在汽车科技日新月异的时代,19 款奔驰 E300 的车主们为了追求更卓越的驾驶体验,纷纷选择对爱车进行升级改装,其中新款触摸屏人机交互系统的改装成为了热门之选。 19 款奔驰 E300 作为一款经典车型&#x…

Vue和axios零基础学习

Vue的配置与项目创建 在这之前要先安装nodejs 安装脚手架 官网 Home | Vue CLI (vuejs.org) 先运行,切换成淘宝镜像源,安装速度更快 npm config set registry http://registry.npm.taobao.org 创建项目 用编译器打开一个空文件,在终端输入…

DMA的原理

一、介绍 DMA(Direct Memory Access)是一种允许设备直接与内存进行数据交换的技术,无需‌CPU干预。DMA的主要功能是提供在‌外设和存储器之间或者存储器和存储器之间的高速数据传输。比如使用ADC进行数据采集,可以直接将数据存入…

【STM32】江科大STM32笔记汇总(已完结)

STM32江科大笔记汇总 STM32学习笔记课程简介(01)STM32简介(02)软件安装(03)新建工程(04)GPIO输出(05)LED闪烁& LED流水灯& 蜂鸣器(06)GPIO输入(07)按键控制LED 光敏传感器控制蜂鸣器(08)OLED调试工具(09)OLED显示屏(10)EXTI外部中断(11)对射式红外传感器计次 旋转编码器…

GAMES101(21~22节,动画和仿真)

Animation 关键帧 动画和几何(曲线)相关 物理模拟/仿真 牛顿第二定律:F ma 需要清楚网格间相互作用力,也需要把物理仿真和渲染分为两部来看,例如布料模拟,流体模拟 mass spring system质点弹簧系统 …

Nest.js实现一个简单的聊天室

本文将介绍如何使用 Nest.js 和 Uni-app 实现一个简单的实时聊天应用。后端使用 nestjs/websockets 和 socket.io,前端使用 uni-app 并集成 socket.io-client。这个项目允许多个用户同时加入聊天并实时交换消息。 效果图: 一、准备工作 安装 Node.js 和…

数据结构与算法——Java实现 24.中缀表达式转后缀

目录 中缀表达式转后缀表达式 引言 思路 代码 正因为我有能力跨越,考验才会降临 —— 24.9.28 中缀表达式转后缀表达式 引言 Java中的编译器会将我们编写代码中的中缀表达式转化为后缀表达式,然后编译好输出程序 思路 遍历中缀表达式,如果遇…

电脑学习通看不到课程解决办法

电脑学习通看不到课程解决办法 查看学习通时发现没有课程 解决方法1: 更改单位 具体见:超星学习通关于PC版无法查看课程问题解决 解决方法二:添加应用 添加应用 点击账号管理 点击应用管理 添加应用、添加首页这个应用 添加完成后查看首页就能看到课程了 然后就OK啦、就可…

[JavaEE] HTTP/HTTPS

目录 一、HTTP 1.1 HTTP是什么 1.2 HTTP发展史 1.3 HTTP工作过程 1.3.1 抓包工具的原理 1.4 HTTP请求格式 1.4.1认识URL 1.5 HTTP响应格式 1.6 认识HTTP"方法"(method) 1.6.1 GET方法 1.6.2 POST方法 1.6.3 其他方法 1.7 GET 与 POST 的区别 1.8 认识…