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

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

MySQL通過自定義函數(shù)實(shí)現(xiàn)遞歸查詢父級(jí)ID或者子級(jí)ID

2024-07-24 12:41:33
字體:
供稿:網(wǎng)友

背 景:

在MySQL中如果是有限的層次,比如我們事先如果可以確定這個(gè)樹的最大深度, 那么所有節(jié)點(diǎn)為根的樹的深度均不會(huì)超過樹的最大深度,則我們可以直接通過left join來實(shí)現(xiàn)。

但很多時(shí)候我們是無法控制或者是知道樹的深度的。這時(shí)就需要在MySQL中用存儲(chǔ)過程(函數(shù))來實(shí)現(xiàn)或者在程序中使用遞歸來實(shí)現(xiàn)。本文討論在MySQL中使用函數(shù)來實(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 ;

三、測試

1、獲取當(dāng)前節(jié)點(diǎn)的所有父級(jí)

SELECT getParentList(10);

2、獲取當(dāng)前節(jié)點(diǎn)的所有字節(jié)

SELECT getChildList(3);

總結(jié)

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 丹凤县| 连江县| 五河县| 龙井市| 都安| 钟祥市| 依安县| 华安县| 卓资县| 卓资县| 山阴县| 桂东县| 常德市| 新野县| 江华| 卢湾区| 婺源县| 彰化市| 凭祥市| 孝昌县| 清丰县| 安顺市| 苗栗县| 奉新县| 永城市| 大同县| 宁陵县| 新丰县| 右玉县| 嵩明县| 永吉县| 汉川市| 天全县| 孝感市| 花莲县| 墨脱县| 武强县| 湾仔区| 新泰市| 潼关县| 平顶山市|