真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

實(shí)現(xiàn)mysql樹查詢的功能

這篇文章給大家分享的是有關(guān)實(shí)現(xiàn)MySQL樹查詢的功能的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考。一起跟隨小編過來看看吧。

創(chuàng)新互聯(lián)長(zhǎng)期為上1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為福海企業(yè)提供專業(yè)的網(wǎng)站制作、網(wǎng)站建設(shè),福海網(wǎng)站改版等技術(shù)服務(wù)。擁有10余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

需求:查找當(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)于實(shí)現(xiàn)mysql樹查詢的功能就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!


網(wǎng)頁(yè)標(biāo)題:實(shí)現(xiàn)mysql樹查詢的功能
網(wǎng)站URL:http://weahome.cn/article/jpgihe.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部