MySQL遞歸查找樹(shù)形結(jié)構(gòu)(這個(gè)方法太實(shí)用了!)
這兩天,遇到了重要節(jié)點(diǎn)的需求。這里簡(jiǎn)單做個(gè)總結(jié)。
1、數(shù)據(jù)庫(kù)中的樹(shù)形結(jié)構(gòu)
數(shù)據(jù)庫(kù)中存貯的數(shù)據(jù),以ID和P_ID(父id),來(lái)存貯樹(shù)形結(jié)構(gòu)
這樣如果需要查找某個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn),就可以尋找P_ID。如果要查找所有子節(jié)點(diǎn),就需要遍歷所有的子節(jié)點(diǎn)的子節(jié)點(diǎn)。
如果要判斷是否為同級(jí)的節(jié)點(diǎn),就可以查找是否有相同的節(jié)點(diǎn)。
2、MySQL中如何查找相應(yīng)的數(shù)據(jù)
這里,我采用的是一個(gè)存儲(chǔ)函數(shù)。在查詢時(shí)可以直接使用。當(dāng)然,為了以后查詢方便,也可以在一個(gè)視圖使用。
3、準(zhǔn)備工作
數(shù)據(jù)庫(kù)表,為了方便,只有三個(gè)字段,能夠說(shuō)明情況即可。
CREATE TABLE `city` ( `i_id` int(11) NOT NULL AUTO_INCREMENT , `p_id` int(11) NULL DEFAULT NULL , `c_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , PRIMARY KEY (`i_id`) ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci AUTO_INCREMENT=11 ROW_FORMAT=COMPACT;
隨便插入幾條數(shù)據(jù)

實(shí)現(xiàn)介紹兩個(gè)關(guān)鍵的函數(shù)
group_concat(column_name): 多條記錄合成一條記錄
SELECT GROUP_CONCAT(i_id) FROM city WHERE p_id='2'

find_in_set(column_name, strlist)在多條記錄中查詢特定列
SELECT * FROM city WHERE FIND_IN_SET(p_id,'1,4')

4.具體的實(shí)現(xiàn)(由淺入深)
1.只查具體一級(jí)下級(jí)
SELECT GROUP_CONCAT(i_id) AS ids FROM city WHERE p_id=1;

2.查詢某一個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn)
在存貯函數(shù)之前,要注意一點(diǎn)。雖然參數(shù)名是 param_i_id,但查詢時(shí) 要讓p_id=param_i_id
CREATE DEFINER = `root`@`localhost` FUNCTION `getSubNodes`(param_i_id int) RETURNS varchar(100) BEGIN #輸入I_ID 輸出此I_ID下的所有子節(jié)點(diǎn)(只有一級(jí)) DECLARE strSubIds VARCHAR(100); DECLARE strPid VARCHAR(100); SET strSubIds = '$'; SET strPid =cast(param_i_id as CHAR); SELECT GROUP_CONCAT(i_id) INTO strSubIds FROM city WHERE p_id=strPid; RETURN strSubIds; END;
這樣,就可以在查詢語(yǔ)句中使用

3.查詢所有下級(jí)
查到了一級(jí),只要循環(huán)查詢到某一個(gè)節(jié)點(diǎn)(這個(gè)節(jié)點(diǎn)沒(méi)有子節(jié)點(diǎn)),就結(jié)束
CREATE DEFINER = `root`@`localhost` FUNCTION `getAllSubNodes`(`param_i_id` int) RETURNS varchar(100) BEGIN DECLARE strAllSubIds VARCHAR(100); DECLARE strTempPid VARCHAR(100); #先得到第一級(jí),也可以掉用getSubNodes(param_i_id); # SELECT GROUP_CONCAT(i_id) INTO strAllSubIds FROM city WHERE p_id=param_i_id; SET strAllSubIds = getSubNodes(param_i_id); SET strTempPid = strAllSubIds; #根據(jù) strTempPid 判斷是否還有子節(jié)點(diǎn) WHILE strTempPid is not null DO SELECT group_concat(i_id) INTO strTempPid FROM city WHERE FIND_IN_SET(p_id,strTempPid)>0; #需要對(duì)strTempPid判斷,非空用 , 連接 IF (strTempPid is not NULL) THEN SET strAllSubIds = concat(strAllSubIds,',',strTempPid); END IF; END WHILE; RETURN strAllSubIds; END;

總結(jié)
到此這篇關(guān)于MySQL遞歸查找樹(shù)形結(jié)構(gòu)的文章就介紹到這了,更多相關(guān)MySQL遞歸查找樹(shù)形結(jié)構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JDBC數(shù)據(jù)庫(kù)的使用操作總結(jié)
本篇文章介紹了,JDBC數(shù)據(jù)庫(kù)的使用操作方法的一些總結(jié)。需要的朋友可以參考一下2013-05-05
SQL中CONVERT轉(zhuǎn)換函數(shù)的簡(jiǎn)單使用方法
CONVERT()函數(shù)對(duì)于簡(jiǎn)單類型轉(zhuǎn)換,CONVERT()函數(shù)和CAST()函數(shù)的功能相同,只是語(yǔ)法不同,下面這篇文章主要給大家介紹了關(guān)于SQL中CONVERT轉(zhuǎn)換函數(shù)的簡(jiǎn)單使用方法,需要的朋友可以參考下2024-01-01
mysql插入數(shù)據(jù)INSERT INTO SET的優(yōu)勢(shì)
這篇文章介紹了mysql插入數(shù)據(jù)INSERT INTO SET的優(yōu)勢(shì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12
Mysql動(dòng)態(tài)更新數(shù)據(jù)庫(kù)腳本的示例講解
今天小編就為大家分享一篇關(guān)于Mysql動(dòng)態(tài)更新數(shù)據(jù)庫(kù)腳本的示例講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
MySQL數(shù)據(jù)庫(kù)存儲(chǔ)引擎介紹及數(shù)據(jù)庫(kù)的操作詳解
mysql面試中最常問(wèn)的問(wèn)題之一:小伙子,你說(shuō)一下你們公司用的存儲(chǔ)引擎,以及你知道有哪些存儲(chǔ)引擎和他們之間的區(qū)別? 所以下面這篇文章主要給大家介紹了關(guān)于Mysql存儲(chǔ)引擎的相關(guān)資料,需要的朋友可以參考下2022-08-08
windows 10下mysql 5.7.21 winx64安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了windows 10下mysql 5.7.21 winx64安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
CentOS7.3下mysql 8.0.13安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了CentOS7.3下mysql 8.0.13安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11

