MySQL通過自定義函式實現遞迴查詢父級ID或者子級ID
阿新 • • 發佈:2020-01-09
背 景:
在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,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!
如果你覺得本文對你有幫助,歡迎轉載,煩請註明出處,謝謝!