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

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

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

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

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

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

遞歸執(zhí)行分析

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

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

demo數(shù)據(jù)

模擬插入10w條數(shù)據(jù), 層級(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é)點(diǎn)數(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),可以在每個(gè)節(jié)點(diǎn)中關(guān)聯(lián)其上級(jí)節(jié)點(diǎn)。最后,通過取manager_id is null的記錄下的子節(jié)點(diǎn)數(shù)據(jù),即可得到完整的樹狀數(shù)據(jù)。

擴(kuò)展

字段擴(kuò)展

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

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
    -- 遞歸情況:為每個(gè)下級(jí)員工添加上級(jí)
    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實(shí)現(xiàn)遞歸樹查詢的使用示例的文章就介紹到這了,更多相關(guān)Mysql 遞歸樹查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

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

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

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

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

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

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

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

    MySQL中按時(shí)間獲取慢日志信息的方法

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

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

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

    MySQL連接查詢你真的學(xué)會(huì)了嗎?

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

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

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

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

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

    Mysql默認(rèn)設(shè)置的危險(xiǎn)性分析

    一.mysql默認(rèn)的授權(quán)表二.缺乏日志能力 三.my.ini文件泄露口令 四.服務(wù)默認(rèn)被綁定全部的網(wǎng)絡(luò)接口上 五.默認(rèn)安裝路徑下的mysql目錄權(quán)限
    2008-09-09
  • 解決MySQL遇到錯(cuò)誤:1217 - Cannot delete or update a parent row: a foreign key constraint fails

    解決MySQL遇到錯(cuò)誤:1217 - Cannot delete or 

    這篇文章主要介紹了解決MySQL遇到錯(cuò)誤:1217 - Cannot delete or update a parent row: a foreign key constraint fails問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06

最新評(píng)論

灵寿县| 长宁区| 二连浩特市| 建阳市| 新安县| 交城县| 曲松县| 临桂县| 宜州市| 台东市| 商河县| 措美县| 鄱阳县| 凤庆县| 乐清市| 兴文县| 建水县| 南平市| 凯里市| 调兵山市| 佛山市| 潮州市| 柘城县| 雅江县| 科尔| 开封市| 鸡西市| 句容市| 彩票| 栖霞市| 灌阳县| 景德镇市| 克什克腾旗| 孙吴县| 莫力| 阜南县| 黄骅市| 翼城县| 新宁县| 南开区| 庆元县|