中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

實現mysql樹查詢的功能

發布時間:2020-10-26 09:25:07 來源:億速云 閱讀:254 作者:小新 欄目:MySQL數據庫

這篇文章給大家分享的是有關實現mysql樹查詢的功能的內容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。

需求:查找當前(任意)級別下的所有子節點。

通過自定義mysql函數實現,先貼代碼,后面給出詳細說明:

delimiter $$
CREATE FUNCTION `getChildList`(rootId INT)
RETURNS varchar(1024)
BEGIN
    DECLARE childListStr VARCHAR(1024);
    DECLARE tempChildStr VARCHAR(1024);
    DECLARE rootIdStr VARCHAR(64);
    SET childListStr=NULL;
    SET rootIdStr=cast(rootId as CHAR);
    myloop: WHILE TRUE
    DO
        SELECT GROUP_CONCAT(id) INTO tempChildStr FROM test where FIND_IN_SET(parrent_id,rootIdStr)>0;
        IF tempChildStr IS NOT NULL THEN
            SET rootIdStr=tempChildStr;
            IF childListStr IS NULL THEN
                SET childListStr=tempChildStr;
            ELSE
                SET childListStr=concat(childListStr,',',tempChildStr);
            END IF;
        ELSE
            LEAVE myloop;
        END IF;
    END WHILE;
  RETURN childListStr;
END $$

建表sql:

CREATE TABLE `test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `parrent_id` int(11) DEFAULT '0',
  `name` varchar(32) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| parrent_id | int(11)          | YES  |     | 0       |                |
| name       | varchar(32)      | YES  |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+

+----+------------+------+
| id | parrent_id | name |
+----+------------+------+
|  1 |          0 | cg1  |
|  2 |          1 | cg2  |
|  3 |          2 | cg3  |
|  4 |          3 | cg4  |
|  5 |          4 | cg5  |
|  6 |          5 | cg6  |
|  7 |          6 | cg7  |
|  8 |          7 | cg8  |
|  9 |          8 | cg9  |
| 10 |          1 | cg10 |
| 11 |          2 | cg11 |
+----+------------+------+

第1行:
delimiter編寫函數體內容的時候,需要使用 DELIMITER 關鍵字將分隔符先修改為別的,否則編寫語句的時候寫到 ';' 的時候會直接執行,導致函數編寫失敗

2-4行:mysql函數語法規范,不多解釋

5-9行:定義邏輯所需變量。

childListStr:最終返回的子節點ids_str(例如:"1,2,3,4,5")。
tempChildStr: 臨時子節點ids_str(例如:"1")。
rootIdStr: 輸入根節點轉換為char類型。

10-23行: 整個函數最關鍵的地方在while里面對tempChildStr的處理,以及對 內置函數GROUP_CONCAT和FIND_IN_SET的理解

每一次循環,通過 GROUP_CONCAT函數找出輸入的根節點的直接下級節點,通過GROUP_CONCAT函數得到這些子節點的id組成的字符串。并將這次得到的子字符串作為根節點,去尋找下一級的所有的子節點。
最后找到最后子節點沒有下級時候,tempChildStr IS NOT NULL。退出循環,返回結果。

運行結果:

mysql> select getChildList(1);
+-----------------------+
| getChildList(1)       |
+-----------------------+
| 2,10,3,11,4,5,6,7,8,9 |
+-----------------------+
1 row in set (0.00 sec)

mysql> select getChildList(2);
+------------------+
| getChildList(2)  |
+------------------+
| 3,11,4,5,6,7,8,9 |
+------------------+
1 row in set (0.00 sec)

感謝各位的閱讀!關于實現mysql樹查詢的功能就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

库伦旗| 旺苍县| 华亭县| 定襄县| 织金县| 山东省| 天气| 乳山市| 营口市| 元谋县| 江源县| 宽城| 唐山市| 龙山县| 镇宁| 曲阳县| 丰县| 怀化市| 泰和县| 丁青县| 正蓝旗| 新平| 渭南市| 曲松县| 项城市| 赣州市| 揭东县| 泗洪县| 泊头市| 黄石市| 东港市| 汉源县| 长治县| 北流市| 永靖县| 肥城市| 施甸县| 尚志市| 柞水县| 阿克苏市| 横峰县|