MySQL遞迴查詢樹狀表的子節點、父節點

Franson發表於2017-05-18

表結構和表資料就不公示了,查詢的表user_role,主鍵是id,每條記錄有parentid欄位;

如下mysql查詢函式即可實現根據一個節點查詢所有的子節點,根據一個子節點查詢所有的父節點。對於資料量較大的時候(我這裡測試的1萬條左右)。查詢效率非常慢。建議在java程式碼中進行處理。

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));

*/

 

相關文章