25行實(shí)現(xiàn)mysql樹查詢代碼詳解

本文主要和大家分享25行實(shí)現(xiàn)mysql樹查詢代碼詳解,希望能幫助到大家。

需求:查找當(dāng)前(任意)級(jí)別下的所有子節(jié)點(diǎn)。

通過自定義mysql函數(shù)實(shí)現(xiàn),先貼代碼,后面給出詳細(xì)說明:

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)容的時(shí)候,需要使用 DELIMITER 關(guān)鍵字將分隔符先修改為別的,否則編寫語句的時(shí)候?qū)懙?‘;’ 的時(shí)候會(huì)直接執(zhí)行,導(dǎo)致函數(shù)編寫失敗

2-4行:mysql函數(shù)語法規(guī)范,不多解釋

5-9行:定義邏輯所需變量。

childListStr:最終返回的子節(jié)點(diǎn)ids_str(例如:”1,2,3,4,5″)。
tempChildStr: 臨時(shí)子節(jié)點(diǎn)ids_str(例如:”1″)。
rootIdStr: 輸入根節(jié)點(diǎn)轉(zhuǎn)換為char類型。

10-23行: 整個(gè)函數(shù)最關(guān)鍵的地方在while里面對(duì)tempChildStr的處理,以及對(duì) 內(nèi)置函數(shù)GROUP_CONCAT和FIND_IN_SET的理解

每一次循環(huán),通過 GROUP_CONCAT函數(shù)找出輸入的根節(jié)點(diǎn)的直接下級(jí)節(jié)點(diǎn),通過GROUP_CONCAT函數(shù)得到這些子節(jié)點(diǎn)的id組成的字符串。并將這次得到的子字符串作為根節(jié)點(diǎn),去尋找下一級(jí)的所有的子節(jié)點(diǎn)。  最后找到最后子節(jié)點(diǎn)沒有下級(jí)時(shí)候,tempChildStr IS NOT NULL。退出循環(huán),返回結(jié)果。

運(yùn)行結(jié)果:

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)

相關(guān)推薦:

SQL語句實(shí)現(xiàn)子孫樹查詢經(jīng)典實(shí)例

SQL語句實(shí)現(xiàn)子孫樹查詢經(jīng)典實(shí)例

SQL語句實(shí)現(xiàn)子孫樹查詢經(jīng)典實(shí)例

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊9 分享