MySQL通過(guò)自定義函數(shù)實(shí)現(xiàn)遞歸查詢父級(jí)ID或者子級(jí)ID
背 景:
在MySQL中如果是有限的層次,比如我們事先如果可以確定這個(gè)樹的最大深度, 那么所有節(jié)點(diǎn)為根的樹的深度均不會(huì)超過(guò)樹的最大深度,則我們可以直接通過(guò)left join來(lái)實(shí)現(xiàn)。
但很多時(shí)候我們是無(wú)法控制或者是知道樹的深度的。這時(shí)就需要在MySQL中用存儲(chǔ)過(guò)程(函數(shù))來(lái)實(shí)現(xiàn)或者在程序中使用遞歸來(lái)實(shí)現(xiàn)。本文討論在MySQL中使用函數(shù)來(lái)實(shí)現(xiàn)的方法:
一、環(huán)境準(zhǔ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、查詢當(dāng)前節(jié)點(diǎn)的所有父級(jí)節(jié)點(diǎn)
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、查詢當(dāng)前節(jié)點(diǎn)的所有子節(jié)點(diǎn)
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 ;
三、測(cè)試
1、獲取當(dāng)前節(jié)點(diǎn)的所有父級(jí)
SELECT getParentList(10);
2、獲取當(dāng)前節(jié)點(diǎn)的所有字節(jié)
SELECT getChildList(3);
總結(jié)
以上所述是小編給大家介紹的MySQL通過(guò)自定義函數(shù)實(shí)現(xiàn)遞歸查詢父級(jí)ID或者子級(jí)ID,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
與MSSQL對(duì)比學(xué)習(xí)MYSQL的心得(八)--插入 更新 刪除
這一篇《與MSSQL對(duì)比學(xué)習(xí)MYSQL的心得(八)》將會(huì)講解MYSQL的插入、更新和刪除語(yǔ)句2014-08-08
win7下mysql6.x出現(xiàn)中文亂碼的完美解決方法
本文給大家分享win7下mysql 6.x出現(xiàn)中文亂碼的完美解決方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-04-04
淺談mysql的timestamp存在的時(shí)區(qū)問(wèn)題
本文主要介紹了淺談mysql的timestamp存在的時(shí)區(qū)問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
Centos7下使用yum安裝mysql數(shù)據(jù)庫(kù)的詳細(xì)教程(增強(qiáng)版)
這篇文章主要介紹了Centos7下使用yum安裝mysql數(shù)據(jù)庫(kù)的詳細(xì)教程(增強(qiáng)版),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12
Linux下Centos7安裝Mysql5.7.19的詳細(xì)教程
這篇文章主要介紹了Linux下Centos7安裝Mysql5.7.19的教程詳解,需要的朋友可以參考下2017-08-08
linux下指定mysql數(shù)據(jù)庫(kù)服務(wù)器主從同步的配置實(shí)例
linux下指定數(shù)據(jù)庫(kù)服務(wù)器主從同步的配置實(shí)例,有需要的朋友可以參考下2013-01-01

