MySQL遞歸查詢樹狀表的子節點、父節點詳細完成。本站提示廣大學習愛好者:(MySQL遞歸查詢樹狀表的子節點、父節點詳細完成)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL遞歸查詢樹狀表的子節點、父節點詳細完成正文
簡介:mysql5.0.94版本,該版本和較高等的版本(5.5、6等等)還沒有支撐輪回遞歸查詢,和sqlserver、oracle比擬,mysql難於在樹狀表中層層遍歷的子節點。本法式重點參考了上面的材料,寫了兩個sql存儲進程,子節點查詢算是照搬了,父節點查詢是逆思想弄的。
表構造和表數據就不公示了,查詢的表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外面多查幾回吧。。。存儲構造有許多長處,包含加速查詢速度、進步平安性等等,然則會加年夜數據庫負荷,許多文章建議聯合應用,小我也認為罕用點會好些。