程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
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存儲過程,子節點查詢算是照搬了,父節點查詢是逆思維弄的。

資料參考: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裡面多查幾次吧。。。存儲結構有很多優點,包括加快查詢速度、提高安全性等等,但是會加大數據庫負荷,很多文章建議結合使用,個人也覺得少用點會好些。

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