25行完成mysql樹查詢代碼詳細說明
發(fā)表時間:2023-07-14 來源:明輝站整理相關軟件相關文章人氣:
[摘要]本文主要和大家分享25行實現(xiàn)mysql樹查詢代碼詳解,希望能幫助到大家。需求:查找當前(任意)級別下的所有子節(jié)點。通過自定義mysql函數(shù)實現(xiàn),先貼代碼,后面給出詳細說明:delimiter $$C...
本文主要和大家分享25行實現(xiàn)mysql樹查詢代碼詳解,希望能幫助到大家。
需求:查找當前(任意)級別下的所有子節(jié)點。
通過自定義mysql函數(shù)實現(xiàn),先貼代碼,后面給出詳細說明:
delimiter $$
CREATE FUNCTION `getChildList`(rootId INT)
RETURNS varchar(1024)
BEGIN
DECLARE childListStr VARCHAR(1024);
DECLARE tempChildStr VARCHAR(1024);
DECLARE rootIdStr VARCHAR(64);
SET childListStr=NULL;
SET rootIdStr=cast(rootId as CHAR);
myloop: WHILE TRUE
DO
SELECT GROUP_CONCAT(id) INTO tempChildStr FROM test where FIND_IN_SET(parrent_id,rootIdStr)>0;
IF tempChildStr IS NOT NULL THEN
SET rootIdStr=tempChildStr;
IF childListStr IS NULL THEN
SET childListStr=tempChildStr;
ELSE
SET childListStr=concat(childListStr,',',tempChildStr);
END IF;
ELSE
LEAVE myloop;
END IF;
END WHILE;
RETURN childListStr;
END $$
建表sql:
CREATE TABLE `test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`parrent_id` int(11) DEFAULT '0',
`name` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;
+------------+------------------+------+-----+---------+----------------+
Field Type Null Key Default Extra
+------------+------------------+------+-----+---------+----------------+
id int(11) unsigned NO PRI NULL auto_increment
parrent_id int(11) YES 0
name varchar(32) YES NULL
+------------+------------------+------+-----+---------+----------------+
+----+------------+------+
id parrent_id name
+----+------------+------+
1 0 cg1
2 1 cg2
3 2 cg3
4 3 cg4
5 4 cg5
6 5 cg6
7 6 cg7
8 7 cg8
9 8 cg9
10 1 cg10
11 2 cg11
+----+------------+------+
第1行:
delimiter編寫函數(shù)體內(nèi)容的時候,需要使用 DELIMITER 關鍵字將分隔符先修改為別的,否則編寫語句的時候寫到 ';' 的時候會直接執(zhí)行,導致函數(shù)編寫失敗
2-4行:mysql函數(shù)語法規(guī)范,不多解釋
5-9行:定義邏輯所需變量。
childListStr:最終返回的子節(jié)點ids_str(例如:"1,2,3,4,5")。
tempChildStr: 臨時子節(jié)點ids_str(例如:"1")。
rootIdStr: 輸入根節(jié)點轉換為char類型。
10-23行: 整個函數(shù)最關鍵的地方在while里面對tempChildStr的處理,以及對 內(nèi)置函數(shù)GROUP_CONCAT和FIND_IN_SET的理解
每一次循環(huán),通過 GROUP_CONCAT函數(shù)找出輸入的根節(jié)點的直接下級節(jié)點,通過GROUP_CONCAT函數(shù)得到這些子節(jié)點的id組成的字符串。并將這次得到的子字符串作為根節(jié)點,去尋找下一級的所有的子節(jié)點。
最后找到最后子節(jié)點沒有下級時候,tempChildStr IS NOT NULL。退出循環(huán),返回結果。
運行結果:
mysql> select getChildList(1);
+-----------------------+
getChildList(1)
+-----------------------+
2,10,3,11,4,5,6,7,8,9
+-----------------------+
1 row in set (0.00 sec)
mysql> select getChildList(2);
+------------------+
getChildList(2)
+------------------+
3,11,4,5,6,7,8,9
+------------------+
1 row in set (0.00 sec)
相關推薦:
SQL語句實現(xiàn)子孫樹查詢經(jīng)典實例
mysql-使用MYSQL實現(xiàn)oracle start with connect by遞歸樹查詢
Oracle樹查詢及相關函數(shù)
以上就是25行實現(xiàn)mysql樹查詢代碼詳解的詳細內(nèi)容,更多請關注php中文網(wǎng)其它相關文章!
學習教程快速掌握從入門到精通的SQL知識。