Mysql实现递归树查询的使用示例

 更新时间:2023年10月11日 10:42:03   作者:饼干,  
Mysql我们可以使用递归查询来构建一个递归树,本文就来介绍一下Mysql实现递归树查询的使用示例,具有一定的参考价值,感兴趣的可以了解一下

大家好! 在我们日常工作中,经常会遇到一些问题,它们的一些解决方案通常会用到递归这一强大的技术手段。递归不仅能帮助我们更高效的解决问题,还可以使代码更简介、更易于理解, 今天我来给大家分享如何在实际工作中使用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()
BEGIN
    DECLARE id INT DEFAULT 2;
    DECLARE parentId INT DEFAULT 1;
    DECLARE counter INT DEFAULT 0;
    -- 第2层
    WHILE counter < 10 DO
        INSERT 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 DO
        SET 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 DO
        SET 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 DO
        SET 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 DO
        SET 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 null
	UNION 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_path
    FROM employees
    WHERE manager_id IS NULL 
    UNION ALL
    -- 递归情况:为每个下级员工添加上级
    SELECT e.id, e.name, e.manager_id, CONCAT(h.hierarchy_path, ' > ', e.name)
    FROM employees e
    JOIN hierarchy h ON e.manager_id = h.id
)
SELECT id, name, manager_id, hierarchy_path 
FROM hierarchy
-- 查询某条数据条件
WHERE name = 'L3-111'
ORDER BY id;

结果如下图:

到此这篇关于Mysql实现递归树查询的使用示例的文章就介绍到这了,更多相关Mysql 递归树查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • MySQL数据库完全备份与增量备份详解

    MySQL数据库完全备份与增量备份详解

    这篇文章主要介绍了MySQL数据库完全备份与增量备份详解,完全备份就是将数据库中的数据及所有对象全部备份,具体详细内容需要的朋友可以参考一下
    2022-08-08
  • MySQL DATE_SUB()函数的实现示例

    MySQL DATE_SUB()函数的实现示例

    本文主要介绍了MySQL DATE_SUB() 函数的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-03-03
  • Mysql实现全文检索、关键词跑分的方法实例

    Mysql实现全文检索、关键词跑分的方法实例

    这篇文章主要给大家介绍了关于Mysql实现全文检索、关键词跑分的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • MySQL中按时间获取慢日志信息的方法

    MySQL中按时间获取慢日志信息的方法

    这篇文章主要介绍了MySQL中按时间获取慢日志信息的方法,使用到了cutlogbytime这个工具,主要操作是设置时间戳,需要的朋友可以参考下
    2015-05-05
  • MYSQL导入导出sql文件简析

    MYSQL导入导出sql文件简析

    这篇文章主要介绍了MYSQL导入导出.sql文件的相关资料,内容包括MYSQL的命令行模式的设置、命令行进入MYSQL的方法、数据库导出数据库文件、从外部文件导入数据到数据库,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • MySQL连接查询你真的学会了吗?

    MySQL连接查询你真的学会了吗?

    日常使用数据库查询语句时,单表查询尝尝不能满足项目的业务需求,在项目开发过程中,有很多需求都是要涉及到多表的连接查询,这篇文章主要给大家介绍了关于MySQL连接查询的相关资料,需要的朋友可以参考下
    2021-06-06
  • MySQL数据库超时设置配置的方法实例

    MySQL数据库超时设置配置的方法实例

    这篇文章主要给大家介绍了关于MySQL数据库超时设置配置的相关资料,通过文中的设置方法可以很好的解决大家遇到的mysql数据库超时问题,需要的朋友可以参考下
    2021-10-10
  • MLSQL编译时权限控制示例详解

    MLSQL编译时权限控制示例详解

    这篇文章主要给大家介绍了关于MLSQL编译时权限控制的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • Mysql默认设置的危险性分析

    Mysql默认设置的危险性分析

    一.mysql默认的授权表二.缺乏日志能力 三.my.ini文件泄露口令 四.服务默认被绑定全部的网络接口上 五.默认安装路径下的mysql目录权限
    2008-09-09
  • 解决MySQL遇到错误:1217 - Cannot delete or update a parent row: a foreign key constraint fails

    解决MySQL遇到错误:1217 - Cannot delete or 

    这篇文章主要介绍了解决MySQL遇到错误:1217 - Cannot delete or update a parent row: a foreign key constraint fails问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06

最新评论