最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mysql實現(xiàn)遞歸樹查詢的使用示例

 更新時間:2023年10月11日 10:42:03   作者:餅干,  
Mysql我們可以使用遞歸查詢來構(gòu)建一個遞歸樹,本文就來介紹一下Mysql實現(xiàn)遞歸樹查詢的使用示例,具有一定的參考價值,感興趣的可以了解一下

大家好! 在我們?nèi)粘9ぷ髦?,?jīng)常會遇到一些問題,它們的一些解決方案通常會用到遞歸這一強大的技術(shù)手段。遞歸不僅能幫助我們更高效的解決問題,還可以使代碼更簡介、更易于理解, 今天我來給大家分享如何在實際工作中使用mysql8+實現(xiàn)遞歸

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

在大型組織中,理解員工建的層級關(guān)系至關(guān)重要。無論是管理、報告和策劃,一個清晰的組織層級視圖都是必不可少的。但是如何有效地從一個大型、復(fù)雜的員工數(shù)據(jù)庫中提取到這樣的層級信息呢?

遞歸執(zhí)行分析

mysql8+遞歸查詢的實現(xiàn)是基于 WITH RECURSIVE語句。它從一個初始的"基礎(chǔ)情況"開始,然后不斷的重復(fù)或"遞歸" 的一個連接操作,直到滿足某個條件為止。
以下是遞歸查詢的基本結(jié)構(gòu):
1. 基礎(chǔ)情況: 這是遞歸的起點,也就是根節(jié)點,在我們場景中根節(jié)點是CEO或者它的上級為null。
2. 遞歸情況: 基于基礎(chǔ)情況,查詢將繼續(xù)擴展,包括下一級的員工,然后類推。

WITH RECURSIVE hierarchy AS (
	-- 基礎(chǔ)情況
	...
	UNION ALL 
	-- 遞歸情況
	...
)
select xxx from hierarchy

demo數(shù)據(jù)

模擬插入10w條數(shù)據(jù), 層級最高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)
);
-- 新增根節(jié)點數(shù)據(jù)
INSERT INTO employees (name) VALUES ('CEO');
-- 創(chuàng)建執(zhí)行過程
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 ;
-- 執(zhí)行執(zhí)行過程
CALL InsertLargeAmountOfData();

查詢demo數(shù)據(jù)

WITH RECURSIVE hierarchy AS (
	-- 基礎(chǔ)情況
	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

結(jié)果

在以上圖例中,通過調(diào)整manager_id is null 可以配置要查詢某條數(shù)據(jù)及該數(shù)據(jù)所有子數(shù)據(jù)的查詢出來的內(nèi)容。

??Tip! 查詢的結(jié)果將以列表形式展現(xiàn)。若業(yè)務(wù)代碼中需要完整的樹狀結(jié)構(gòu),可以在每個節(jié)點中關(guān)聯(lián)其上級節(jié)點。最后,通過取manager_id is null的記錄下的子節(jié)點數(shù)據(jù),即可得到完整的樹狀數(shù)據(jù)。

擴展

字段擴展

在業(yè)務(wù)中常常會需要查詢某條記錄并返回該字段在組織層次中的位置,你可以參考以下代碼:

WITH RECURSIVE hierarchy AS (
    -- 基礎(chǔ)情況:從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
-- 查詢某條數(shù)據(jù)條件
WHERE name = 'L3-111'
ORDER BY id;

結(jié)果如下圖:

到此這篇關(guān)于Mysql實現(xiàn)遞歸樹查詢的使用示例的文章就介紹到這了,更多相關(guān)Mysql 遞歸樹查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • MySQL數(shù)據(jù)庫完全備份與增量備份詳解

    MySQL數(shù)據(jù)庫完全備份與增量備份詳解

    這篇文章主要介紹了MySQL數(shù)據(jù)庫完全備份與增量備份詳解,完全備份就是將數(shù)據(jù)庫中的數(shù)據(jù)及所有對象全部備份,具體詳細內(nèi)容需要的朋友可以參考一下
    2022-08-08
  • MySQL DATE_SUB()函數(shù)的實現(xiàn)示例

    MySQL DATE_SUB()函數(shù)的實現(xiàn)示例

    本文主要介紹了MySQL DATE_SUB() 函數(shù)的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-03-03
  • Mysql實現(xiàn)全文檢索、關(guān)鍵詞跑分的方法實例

    Mysql實現(xiàn)全文檢索、關(guān)鍵詞跑分的方法實例

    這篇文章主要給大家介紹了關(guān)于Mysql實現(xiàn)全文檢索、關(guān)鍵詞跑分的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • MySQL中按時間獲取慢日志信息的方法

    MySQL中按時間獲取慢日志信息的方法

    這篇文章主要介紹了MySQL中按時間獲取慢日志信息的方法,使用到了cutlogbytime這個工具,主要操作是設(shè)置時間戳,需要的朋友可以參考下
    2015-05-05
  • MYSQL導(dǎo)入導(dǎo)出sql文件簡析

    MYSQL導(dǎo)入導(dǎo)出sql文件簡析

    這篇文章主要介紹了MYSQL導(dǎo)入導(dǎo)出.sql文件的相關(guān)資料,內(nèi)容包括MYSQL的命令行模式的設(shè)置、命令行進入MYSQL的方法、數(shù)據(jù)庫導(dǎo)出數(shù)據(jù)庫文件、從外部文件導(dǎo)入數(shù)據(jù)到數(shù)據(jù)庫,感興趣的小伙伴們可以參考一下
    2016-04-04
  • MySQL連接查詢你真的學會了嗎?

    MySQL連接查詢你真的學會了嗎?

    日常使用數(shù)據(jù)庫查詢語句時,單表查詢嘗嘗不能滿足項目的業(yè)務(wù)需求,在項目開發(fā)過程中,有很多需求都是要涉及到多表的連接查詢,這篇文章主要給大家介紹了關(guān)于MySQL連接查詢的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • MySQL數(shù)據(jù)庫超時設(shè)置配置的方法實例

    MySQL數(shù)據(jù)庫超時設(shè)置配置的方法實例

    這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫超時設(shè)置配置的相關(guān)資料,通過文中的設(shè)置方法可以很好的解決大家遇到的mysql數(shù)據(jù)庫超時問題,需要的朋友可以參考下
    2021-10-10
  • MLSQL編譯時權(quán)限控制示例詳解

    MLSQL編譯時權(quán)限控制示例詳解

    這篇文章主要給大家介紹了關(guān)于MLSQL編譯時權(quán)限控制的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用mysql具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-03-03
  • Mysql默認設(shè)置的危險性分析

    Mysql默認設(shè)置的危險性分析

    一.mysql默認的授權(quán)表二.缺乏日志能力 三.my.ini文件泄露口令 四.服務(wù)默認被綁定全部的網(wǎng)絡(luò)接口上 五.默認安裝路徑下的mysql目錄權(quán)限
    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

最新評論

峨边| 南靖县| 巧家县| 乐清市| 卢氏县| 淮阳县| 新田县| 苍山县| 泰安市| 秦安县| 伊宁县| 紫云| 和平区| 宕昌县| 栾城县| 边坝县| 乌鲁木齐市| 宜丰县| 平谷区| 炎陵县| 平湖市| 宾川县| 辉南县| 天水市| 新蔡县| 青海省| 莱芜市| 略阳县| 江华| 和平县| 灌云县| 濮阳市| 绥中县| 临海市| 卫辉市| 庆安县| 东海县| 灌云县| 抚顺县| 宿迁市| 阳曲县|