簡介:mysql5.0.94版本,該版本以及較高級的版本(5.5、6等等)尚未支持循環遞歸查詢,和sqlserver、oracle相比,mysql難於在樹狀表中層層遍歷的子節點。本程序重點參考了下面的資料,寫了兩個sql存儲過程,子節點查詢算是照搬了,父節點查詢是逆思維弄的。
資料參考:http://blog.csdn.net/ACMAIN_CHM/article/details/4142971#comments
表結構和表數據就不公示了,查詢的表user_role,主鍵是id,每條記錄有parentid字段(對應該記錄的父節點,當然,一個父節點自然會有一個以上的子節點嘛)
CREATE FUNCTION `getChildList`(rootId INT) RETURNS varchar(1000) BEGIN DECLARE sChildList VARCHAR(1000); DECLARE sChildTemp VARCHAR(1000); SET sChildTemp =cast(rootId as CHAR); WHILE sChildTemp is not null DO IF (sChildList is not null) THEN SET sChildList = concat(sChildList,',',sChildTemp); ELSE SET sChildList = concat(sChildTemp); END IF; SELECT group_concat(id) INTO sChildTemp FROM user_role where FIND_IN_SET(parentid,sChildTemp)>0; END WHILE; RETURN sChildList; END; /*獲取子節點*/ /*調用: 1、select getChildList(0) id; 2、select * 5From user_role where FIND_IN_SET(id, getChildList(2));*/ CREATE FUNCTION `getParentList`(rootId INT) RETURNS varchar(1000) BEGIN DECLARE sParentList varchar(1000); DECLARE sParentTemp varchar(1000); SET sParentTemp =cast(rootId as CHAR); WHILE sParentTemp is not null DO IF (sParentList is not null) THEN SET sParentList = concat(sParentTemp,',',sParentList); ELSE SET sParentList = concat(sParentTemp); END IF; SELECT group_concat(parentid) INTO sParentTemp FROM user_role where FIND_IN_SET(id,sParentTemp)>0; END WHILE; RETURN sParentList; END; /*獲取父節點*/ /*調用: 1、select getParentList(6) id; 2、select * From user_role where FIND_IN_SET(id, getParentList(2));*/弄完了,pm說不要弄存儲結構,在java裡面多查幾次吧。。。存儲結構有很多優點,包括加快查詢速度、提高安全性等等,但是會加大數據庫負荷,很多文章建議結合使用,個人也覺得少用點會好些。