程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 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裡面多查幾次吧。。。存儲結構有很多優點,包括加快查詢速度、提高安全性等等,但是會加大數據庫負荷,很多文章建議結合使用,個人也覺得少用點會好些。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved