背 景:
在MySQL中如果是有限的層次,比如我們事先如果可以確定這個樹的最大深度, 那么所有節(jié)點為根的樹的深度均不會超過樹的最大深度,則我們可以直接通過left join來實現(xiàn)。
但很多時候我們是無法控制或者是知道樹的深度的。這時就需要在MySQL中用存儲過程(函數(shù))來實現(xiàn)或者在程序中使用遞歸來實現(xiàn)。本文討論在MySQL中使用函數(shù)來實現(xiàn)的方法:
一、環(huán)境準備
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、插入數(shù)據(jù)
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函數(shù)的編寫
1、查詢當前節(jié)點的所有父級節(jié)點
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、查詢當前節(jié)點的所有子節(jié)點
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、獲取當前節(jié)點的所有父級
SELECT getParentList(10);
2、獲取當前節(jié)點的所有字節(jié)
總結(jié)
以上所述是小編給大家介紹的MySQL通過自定義函數(shù)實現(xiàn)遞歸查詢父級ID或者子級ID,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
您可能感興趣的文章:- MySQL遞歸查詢樹狀表的子節(jié)點、父節(jié)點具體實現(xiàn)
- Mysql樹形遞歸查詢的實現(xiàn)方法
- SQL如何實現(xiàn)MYSQL的遞歸查詢
- MySql8 WITH RECURSIVE遞歸查詢父子集的方法
- Mysql8.0遞歸查詢的簡單用法示例