【Mysql实现递归树查询】

Mysql8+实现递归查询

    • 递归执行分析
    • demo数据
    • 查询demo数据
    • 扩展
      • 字段扩展

大家好! 在我们日常工作中,经常会遇到一些问题,它们的一些解决方案通常会用到递归这一强大的技术手段。递归不仅能帮助我们更高效的解决问题,还可以使代码更简介、更易于理解, 今天我来给大家分享如何在实际工作中使用mysql8+实现递归

💡Tip !!! 需要Mysql 8+上的版本支持

在大型组织中,理解员工建的层级关系至关重要。无论是管理、报告和策划,一个清晰的组织层级视图都是必不可少的。但是如何有效地从一个大型、复杂的员工数据库中提取到这样的层级信息呢?

递归执行分析

mysql8+递归查询的实现是基于 WITH RECURSIVE语句。它从一个初始的"基础情况"开始,然后不断的重复或"递归" 的一个连接操作,直到满足某个条件为止。
以下是递归查询的基本结构:
1. 基础情况: 这是递归的起点,也就是根节点,在我们场景中根节点是CEO或者它的上级为null。
2. 递归情况: 基于基础情况,查询将继续扩展,包括下一级的员工,然后类推。

WITH RECURSIVE hierarchy AS (-- 基础情况...UNION ALL -- 递归情况...
)
select xxx from hierarchy

demo数据

模拟插入10w条数据, 层级最高6层

DROP TABLE IF EXISTS employees;CREATE TABLE employees (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100),manager_id INT,FOREIGN KEY (manager_id) REFERENCES employees(id)
);
-- 新增根节点数据
INSERT INTO employees (name) VALUES ('CEO');
-- 创建执行过程
DELIMITER $$
CREATE PROCEDURE InsertLargeAmountOfData()
BEGINDECLARE id INT DEFAULT 2;DECLARE parentId INT DEFAULT 1;DECLARE counter INT DEFAULT 0;-- 第2层WHILE counter < 10 DOINSERT INTO employees (name, manager_id) VALUES (CONCAT('L2-', id), 1);SET id = id + 1;SET counter = counter + 1;END WHILE;SET counter = 0;-- 第3层WHILE counter < 100 DOSET parentId = 1 + FLOOR(counter / 10) + 1;INSERT INTO employees (name, manager_id) VALUES (CONCAT('L3-', id), parentId);SET id = id + 1;SET counter = counter + 1;END WHILE;SET counter = 0;-- 第4层WHILE counter < 1000 DOSET parentId = 11 + FLOOR(counter / 100);INSERT INTO employees (name, manager_id) VALUES (CONCAT('L4-', id), parentId);SET id = id + 1;SET counter = counter + 1;END WHILE;SET counter = 0;-- 第5层WHILE counter < 10000 DOSET parentId = 111 + FLOOR(counter / 1000);INSERT INTO employees (name, manager_id) VALUES (CONCAT('L5-', id), parentId);SET id = id + 1;SET counter = counter + 1;END WHILE;SET counter = 0;-- 第6层WHILE counter < 88889 DOSET parentId = 1111 + FLOOR(counter / 10000);INSERT INTO employees (name, manager_id) VALUES (CONCAT('L6-', id), parentId);SET id = id + 1;SET counter = counter + 1;END WHILE;END$$
DELIMITER ;
-- 执行执行过程
CALL InsertLargeAmountOfData();

查询demo数据

WITH RECURSIVE hierarchy AS (-- 基础情况select id,name,manager_id from employees where manager_id is nullUNION ALL -- 递归情况select e.* from employees as e  inner join hierarchy as h on e.manager_id = h.id
)
select id,name,manager_id from hierarchy

结果
在这里插入图片描述
在以上图例中,通过调整manager_id is null 可以配置要查询某条数据及该数据所有子数据的查询出来的内容。

💡Tip! 查询的结果将以列表形式展现。若业务代码中需要完整的树状结构,可以在每个节点中关联其上级节点。最后,通过取manager_id is null的记录下的子节点数据,即可得到完整的树状数据。

扩展

字段扩展

在业务中常常会需要查询某条记录并返回该字段在组织层次中的位置,你可以参考以下代码:

WITH RECURSIVE hierarchy AS (-- 基础情况:从CEO开始SELECT id, name, manager_id, CAST(name AS CHAR(255)) AS hierarchy_pathFROM employeesWHERE manager_id IS NULL UNION ALL-- 递归情况:为每个下级员工添加上级SELECT e.id, e.name, e.manager_id, CONCAT(h.hierarchy_path, ' > ', e.name)FROM employees eJOIN hierarchy h ON e.manager_id = h.id
)
SELECT id, name, manager_id, hierarchy_path 
FROM hierarchy
-- 查询某条数据条件
WHERE name = 'L3-111'
ORDER BY id;

结果如下图:
在这里插入图片描述

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

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

相关文章

竹云筑基,量子加密| 竹云携手国盾量子构建量子身份安全防护体系

9月23日-24日&#xff0c;2023量子产业大会在安徽合肥举行。作为量子科技领域行业盛会&#xff0c;2023年量子产业大会以“协同创新 量点未来”为主题&#xff0c;展示了前沿的量子信息技术、产业创新成果&#xff0c;并举办主旨论坛、量子科普讲座等系列专项活动。量子信息作为…

云服务器带宽对上传下载速度的影响

简单来说就是 云服务器收到数据代表入&#xff0c;带宽大小 < 10时&#xff0c;入带宽大小10 带宽大小 > 10时&#xff0c;出入带宽上限 等于实际购买时候的大小

金融信创黄金三年:小程序生态+跨端技术框架构建

小程序应用场景生态的发展&#xff0c;受益于开源技术的发展&#xff0c;以及响应快速开发的实际业务需求&#xff0c;一些跨端框架如&#xff1a;Electron、wxPython、FinClip、Tauri、Flutter等发展也非常迅速&#xff0c;小程序生态跨端技术框架&#xff0c;不仅能满足自有超…

生活中的视音频技术

生活中的视音频技术 平时我们打开电脑中自己存电影的目录的话&#xff0c;一般都会如下图所示&#xff0c;一大堆五花八门的电影。&#xff08;其实专业的影视爱好者一概会把影视文件分门别类的&#xff0c;但我比较懒&#xff0c;一股脑把电影放在了一起&#xff09; 因为下载…

10.9~10.10

触发器方程 触发器之间的转化 触发器需要输入和输出 对于D触发器&#xff0c;只需要D信号的输入 对于jk触发器&#xff0c;至少需要原状态的与非信号&#xff0c;并且需要j,k信号 假如确定y2,则D触发器需要什么D信号&#xff0c;是需要卡诺图确定 j-k触发器需要什么jk信号…

经典循环命题:百钱百鸡

翁五钱一只&#xff0c;母三钱&#xff0c;小鸡三只一钱&#xff1b;百钱百鸡百鸡花百钱。 (本笔记适合能熟练应用for循环、会使if条件分支语句、能格式化字符输出的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a…

【数据结构】二叉树的链式结构及实现

目录 1. 前置说明 2. 二叉树的遍历 2.1 前序、中序以及后序遍历 2.2 层序遍历 3. 节点个数及高度等 4. 二叉树的创建和销毁 1. 前置说明 在学习二叉树的基本操作前&#xff0c;需先要创建一棵二叉树&#xff0c;然后才能学习其相关的基本操作。由于现在大家对二叉树结构…

区块链跨链技术

区块链跨链技术 背景 近年来&#xff0c;随着区块链技术的不断发展&#xff0c;区块链的应用场景逐渐从最初的加密货币领域扩展到金融、物流、医疗、公共服务等各个领域。随着区块链的应用场景不断增多&#xff0c;区块链的“数据孤岛”问题日益突出&#xff0c;不同场景下的…

生信学院|10月13日《SOLIDWORKS参数化应用——DriveWorksXpress》

课程主题&#xff1a;SOLIDWORKS参数化应用——DriveWorksXpress 课程时间&#xff1a;2023年10月13日 14:00-14:30 主讲人&#xff1a;温晓露 生信科技 售后服务工程师 1、DriveWorks的作用 2、用 DriveWorksXpress 自动化您的设计过程 3、Drive Works Xpress最佳做法 4…

如何将jpg转化为png?

如何将jpg转化为png&#xff1f;可能有的小伙伴就会疑惑了&#xff0c;jpg和png都是图片常用的一种格式&#xff0c;为什么要进行格式的更改呢&#xff1f;那是因为PNG格式具有更好的图片质量和更少的失真。JPG&#xff08;或JPEG&#xff09;格式的图片通常是压缩过的&#xf…

Mall脚手架总结(二) —— SpringData操作Elasticsearch

前言 万字长文带你弄清楚SpringData中的Elasticsearch操作以及在脚手架里接口的结构关系&#xff01;经过前面鉴证授权的整合&#xff0c;荔枝开始熟悉项目的学习的方法了&#xff0c;虽然脚手架中的内容比较简单&#xff0c;但是把边角的知识点全部扫到还是比较花时间的尤其是…

C#和JS交互之Microsoft.ClearScript.V8(V8引擎)

之前测试了很多JS引擎&#xff0c;都只支持es5语法&#xff0c;不支持执行es6&#xff0c;测试了下微软的V8反正能跑通&#xff0c;应该是支持的。还得是微软呀。 如图&#xff1a;安装相关包&#xff1a; 这是参考的官方V8代码 using Microsoft.ClearScript.JavaScript; us…

当下测试行业中UI自动化面临的难点及如何解决

经常有人会问&#xff0c;什么样的项目才适合进行UI自动化测试呢&#xff1f;UI自动化测试相当于模拟手工测试&#xff0c;通过程序去操作页面上的控件。而在实际测试过程中&#xff0c;经常会遇到无法找到控件&#xff0c;或者因控件定义变更而带来的维护成本等问题。 哪些场…

jvm--执行引擎

文章目录 1. 执行引擎的工作流程2. 解释器、JIT及时编译器3. 热点代码及探测技术4. HotSpotVM 中 JIT 分类 执行引擎属于 JVM 的下层&#xff0c;里面包括解释器、及时编译器、垃圾回收器 JVM 的主要任务是负责 装载字节码到其内部&#xff0c;但字节码并不能够直接运行在操作…

Zookeeper分布式一致性协议ZAB源码剖析

文章目录 1、ZAB协议介绍2、消息广播 1、ZAB协议介绍 ZAB 协议全称&#xff1a;Zookeeper Atomic Broadcast&#xff08;Zookeeper 原子广播协议&#xff09;。 Zookeeper 是一个为分布式应用提供高效且可靠的分布式协调服务。在解决分布式一致性方面&#xff0c;Zookeeper 并…

栈的模拟实现(Java)

目录 1、 栈的概念2、栈的使用3、栈的模拟实现 1、 栈的概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last I…

Linux 部署1Panel 现代化运维管理面板进行公网远程访问

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《速学数据结构》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透2.1 使用一键脚本安装命令 2.2向系统添加服务2.3 启动cpolar服务…

爬虫Python

文章目录 基本数据类型bytes类型python数据类型转换&#xff08;必会&#xff01;&#xff01;&#xff01;&#xff09; python运算符&#xff08;必会&#xff01;&#xff01;&#xff01;&#xff09;python数字数学函数&#xff08;必会&#xff01;&#xff01;&#xff…

uni-app:实现view元素强制换行(解决长字符和英文字符不换行问题)

效果 换行前 换行后 核心代码 word-wrap: break-word; 或 word-break: break-all; 完整代码demo <template><view><view class"all_style"><view class"line1">aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</view>…

ubuntu离线编译安装cmake 3.22.5(could not fonud OPENSSL) and cmake-versinon查不到版本问题

1、首先去cmake官网下载压缩包,例如: cmake-3.22.5.tar.gz 2、拉到ubuntu进行解压: tar -zxcf cmake-3.22.5.tar.gz 3、cd 进入目录 cd cmake-3.22.5 4、执行configure可执行文件 ./configure 如果在编译过程中出现报错:Could NOT findOpenSSL,原因可能是缺少ssl库 按…