MySQL通過自定義函數實現遞歸查詢父級ID或者子級ID

来源:https://www.cnblogs.com/cmacro/archive/2019/11/26/11937341.html
-Advertisement-
Play Games

背 景: 在MySQL中如果是有限的層次,比如我們事先如果可以確定這個樹的最大深度, 那麼所有節點為根的樹的深度均不會超過樹的最大深度,則我們可以直接通過left join來實現。 但很多時候我們是無法控制或者是知道樹的深度的。這時就需要在MySQL中用存儲過程(函數)來實現或者在程式中使用遞歸來實 ...


背 景:

在MySQL中如果是有限的層次,比如我們事先如果可以確定這個樹的最大深度, 那麼所有節點為根的樹的深度均不會超過樹的最大深度,則我們可以直接通過left join來實現。

但很多時候我們是無法控制或者是知道樹的深度的。這時就需要在MySQL中用存儲過程(函數)來實現或者在程式中使用遞歸來實現。本文討論在MySQL中使用函數來實現的方法:

一、環境準備

 

1、建表

1 CREATE TABLE `table_name`  (
2   `id` int(11) NOT NULL AUTO_INCREMENT,
3   `status` int(255) NULL DEFAULT NULL,
4   `pid` int(11) NULL DEFAULT NULL,
5   PRIMARY KEY (`id`) USING BTREE
6 ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

 

2、插入數據

 1 INSERT INTO `table_name` VALUES (1, 12, 0);
 2 INSERT INTO `table_name` VALUES (2, 4, 1);
 3 INSERT INTO `table_name` VALUES (3, 8, 2);
 4 INSERT INTO `table_name` VALUES (4, 16, 3);
 5 INSERT INTO `table_name` VALUES (5, 32, 3);
 6 INSERT INTO `table_name` VALUES (6, 64, 3);
 7 INSERT INTO `table_name` VALUES (7, 128, 6);
 8 INSERT INTO `table_name` VALUES (8, 256, 7);
 9 INSERT INTO `table_name` VALUES (9, 512, 8);
10 INSERT INTO `table_name` VALUES (10, 1024, 9);
11 INSERT INTO `table_name` VALUES (11, 2048, 10);

 

二、MySQL函數的編寫

 

1、查詢當前節點的所有父級節點

 1 delimiter // 
 2 CREATE FUNCTION `getParentList`(root_id BIGINT) 
 3      RETURNS VARCHAR(1000) 
 4      BEGIN 
 5           DECLARE k INT DEFAULT 0;
 6         DECLARE fid INT DEFAULT 1;
 7         DECLARE str VARCHAR(1000) DEFAULT '$';
 8         WHILE rootId > 0 DO
 9               SET fid=(SELECT pid FROM table_name WHERE root_id=id); 
10               IF fid > 0 THEN
11                   SET str = concat(str,',',fid);   
12                   SET root_id = fid;  
13               ELSE 
14                   SET root_id=fid;  
15               END IF;  
16      END WHILE;
17    RETURN str;
18  END  //
19  delimiter ;

 

2、查詢當前節點的所有子節點

 1  
 2  delimiter //
 3  CREATE FUNCTION `getChildList`(root_id BIGINT) 
 4      RETURNS VARCHAR(1000) 
 5      BEGIN 
 6        DECLARE str VARCHAR(1000) ; 
 7        DECLARE cid VARCHAR(1000) ; 
 8        DECLARE k INT DEFAULT 0;
 9        SET str = '$'; 
10        SET cid = CAST(root_id AS CHAR);12        WHILE cid IS NOT NULL DO  
13                 IF k > 0 THEN
14                   SET str = CONCAT(str,',',cid);
15                 END IF;
16                 SELECT GROUP_CONCAT(id) INTO cid FROM table_name WHERE FIND_IN_SET(pid,cid)>0;
17                 SET k = k + 1;
18        END WHILE; 
19        RETURN str; 
20 END //  
21 delimiter ;

 

三、測試

1、獲取當前節點的所有父級

SELECT getParentList(10);

 

2、獲取當前節點的所有位元組

SELECT getChildList(3);

 

本文完......


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 註:本篇文章暫時不做流程圖,如果有需求後續補做。 1. 需要準備的源碼文件列表: base部分: kernel\base\core.c kernel\base\bus.c kernel\base\dd.c kernel\base\class.c kernel\base\driver.c 頭文件部分: ...
  • 設置規則 參考 :https://blog.csdn.net/weixin_41004350/article/details/78492367 參考 : https://www.jianshu.com/p/d93e2b177814 定時任務啟動python腳本規則案例 參考:https://www. ...
  • IntelliJ IDEA 簡稱 IDEA,被業界公認為最好的 Java 集成開發工具,尤其在智能代碼助手、代碼自動提示、代碼重構、代碼版本管理(Git、SVN、Maven)、單元測試、代碼分析等方面有著亮眼的發揮。IDEA 產於捷克,開發人員以嚴謹著稱的東歐程式員為主。IDEA 分為社區版和付費版 ...
  • [TOC] 在Linux下麵有相當多的壓縮命令可以運行,這些壓縮命令可以讓我們更方便地從網路上面下載容量較大的文件。 此外,我們知道在Linux下麵,擴展名沒有什麼特殊的意義。 不過,針對這些壓縮命令所產生的壓縮文件,為了方便記憶,還是會有一些特殊的命名方式,就讓我們來看看吧! 文件壓縮 什麼是文件 ...
  • 卸載系統自帶的jdk 1. 查詢系統是否已經安裝了jdk rpm -qa|grep java 2. 卸載已安裝的jdk, 系統可能會自帶多個jdk版本, 按需卸載 rpm -e --nodeps java-1.7.0-openjdk-1.7.0.141-2.6.10.5.el7.x86_64 3.  ...
  • https://sqlserver.code.blog/2019/11/26/missing-msi-and-msp-files/ ...
  • 預讀:用估計信息,去硬碟讀取數據到緩存。預讀100次,也就是估計將要從硬碟中讀取了100頁數據到緩存。 物理讀:查詢計劃生成好以後,如果緩存缺少所需要的數據,讓緩存再次去讀硬碟。物理讀10頁,從硬碟中讀取10頁數據到緩存。 邏輯讀:從緩存中取出所有數據。邏輯讀100次,也就是從緩存里取到100頁數據 ...
  • bitmap就是在一個二進位的數據中,每一個位代表一定的含義,這樣最終只需要存一個整型數據,就可以解釋出多個含義.業務中有一個欄位專門用來存儲用戶對某些功能的開啟和關閉,如果是傳統的思維,肯定是建一個欄位來存0代表關閉,1代表開啟,那麼如果功能很多或者需要加功能開關,就需要不停的創建欄位.使用bit ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...