国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

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

2020-01-18 20:38:37
字體:
來源:轉載
供稿:網友

背 景:

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

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

一、環境準備

1、建表

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

2、插入數據

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

二、MySQL函數的編寫

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

delimiter // CREATE FUNCTION `getParentList`(root_id BIGINT)    RETURNS VARCHAR(1000)    BEGIN      DECLARE k INT DEFAULT 0;     DECLARE fid INT DEFAULT 1;     DECLARE str VARCHAR(1000) DEFAULT '$';     WHILE rootId > 0 DO       SET fid=(SELECT pid FROM table_name WHERE root_id=id);        IF fid > 0 THEN         SET str = concat(str,',',fid);           SET root_id = fid;        ELSE          SET root_id=fid;        END IF;    END WHILE;   RETURN str; END // delimiter ;

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

delimiter //CREATE FUNCTION `getChildList`(root_id BIGINT)   RETURNS VARCHAR(1000)   BEGIN    DECLARE str VARCHAR(1000) ;    DECLARE cid VARCHAR(1000) ;    DECLARE k INT DEFAULT 0;   SET str = '$';    SET cid = CAST(root_id AS CHAR);12    WHILE cid IS NOT NULL DO         IF k > 0 THEN         SET str = CONCAT(str,',',cid);        END IF;        SELECT GROUP_CONCAT(id) INTO cid FROM table_name WHERE FIND_IN_SET(pid,cid)>0;        SET k = k + 1;   END WHILE;    RETURN str; END // delimiter ;

三、測試

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

SELECT getParentList(10);

2、獲取當前節點的所有字節

SELECT getChildList(3);

總結

以上所述是小編給大家介紹的MySQL通過自定義函數實現遞歸查詢父級ID或者子級ID,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 灯塔市| 酉阳| 安顺市| 穆棱市| 万州区| 衡山县| 广元市| 龙口市| 定陶县| 隆子县| 宝丰县| 佛教| 建水县| 马尔康县| 和林格尔县| 嘉定区| 石门县| 潼关县| 连城县| 石景山区| 静安区| 环江| 黄平县| 东乌珠穆沁旗| 新田县| 鸡泽县| 雷山县| 普格县| 台北县| 西乌珠穆沁旗| 汉源县| 肇源县| 丰顺县| 淳安县| 梅河口市| 金坛市| 玉田县| 梅州市| 视频| 舟山市| 宁海县|