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中any、some和all的用法实例

    MySQL中any、some和all的用法实例

    最近一直在练习MYSQL的多表查询,基本上每个查询语句我都会写至少两次,下面这篇文章主要给大家介绍了关于MySQL中any、some和all用法的相关资料,需要的朋友可以参考下
    2022-11-11
  • MySQL的表分区详解

    MySQL的表分区详解

    这篇文章主要介绍了MySQL的表分区,例如什么是表分区、为什么要对表进行分区、表分区的4种类型详解等,需要的朋友可以参考下
    2014-03-03
  • Mysql事务的隔离级别(脏读+幻读+可重复读)

    Mysql事务的隔离级别(脏读+幻读+可重复读)

    这篇文章主要介绍了Mysql事务的隔离级别(脏读+幻读+可重复读),文章通告InnoDB展开详细内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-08-08
  • Mysql单表访问方法图文示例详解

    Mysql单表访问方法图文示例详解

    这篇文章主要为大家介绍了Mysql单表访问方法图文示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • 面试中老生常谈的MySQL问答集锦夯实基础

    面试中老生常谈的MySQL问答集锦夯实基础

    这篇文章主要为大家介绍了面试中老生常谈的MySQL问答集锦,不仅可以帮助大家顺利通过面试更可以夯实大家的基础,有需要的朋友可以借鉴参考下
    2022-03-03
  • MySQL 主从复制数据不一致的解决方法

    MySQL 主从复制数据不一致的解决方法

    本文主要介绍了MySQL 主从复制数据不一致的解决方法,文中根据实例编码详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • mysql dblink跨库关联查询的实现

    mysql dblink跨库关联查询的实现

    本文主要介绍了mysql dblink跨库关联查询的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Mysql存在则修改不存在则新增的两种实现方法实例

    Mysql存在则修改不存在则新增的两种实现方法实例

    mysql语法支持如果数据存在则更新,不存在则插入,下面这篇文章主要给大家介绍了关于Mysql存在则修改不存在则新增的两种实现方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • 分析mysql中一条SQL查询语句是如何执行的

    分析mysql中一条SQL查询语句是如何执行的

    为了充分发挥MySQL的性能并顺利地使用,就必须正确理解其设计思想,因此,了解MySQL的逻辑架构是必要的。本文将通过一条SQL查询语句的具体执行过程来详细介绍MySQL架构中的各个组件
    2021-06-06
  • MySQL5.7中 performance和sys schema中的监控参数解释(推荐)

    MySQL5.7中 performance和sys schema中的监控参数解释(推荐)

    在MySQL5.7中,performance schema有很大改进,包括引入大量新加入的监控项、降低占用空间和负载,以及通过新的sys schema机制显著提升易用性。下面通过本文给大家介绍 MySQL5.7中 performance和sys schema中的监控参数解释,需要的朋友可以参考下
    2017-08-08

最新评论