這篇文章給大家分享的是有關(guān)實現(xiàn)MySQL樹查詢的功能的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。
創(chuàng)新互聯(lián)長期為上1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為福海企業(yè)提供專業(yè)的網(wǎng)站制作、網(wǎng)站建設(shè),福海網(wǎng)站改版等技術(shù)服務(wù)。擁有10余年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
需求:查找當(dāng)前(任意)級別下的所有子節(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 關(guān)鍵字將分隔符先修改為別的,否則編寫語句的時候?qū)懙?';' 的時候會直接執(zhí)行,導(dǎo)致函數(shù)編寫失敗
2-4行:mysql函數(shù)語法規(guī)范,不多解釋
5-9行:定義邏輯所需變量。
childListStr:最終返回的子節(jié)點ids_str(例如:"1,2,3,4,5")。
tempChildStr: 臨時子節(jié)點ids_str(例如:"1")。
rootIdStr: 輸入根節(jié)點轉(zhuǎn)換為char類型。
10-23行: 整個函數(shù)最關(guān)鍵的地方在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),返回結(jié)果。
運行結(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)于實現(xiàn)mysql樹查詢的功能就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
網(wǎng)頁標(biāo)題:實現(xiàn)mysql樹查詢的功能
當(dāng)前地址:http://muchs.cn/article44/jpgihe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站排名、小程序開發(fā)、網(wǎng)頁設(shè)計公司、網(wǎng)站制作、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)