表結構和表資料就不公示了,查詢的表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));
*/