本文為博主原創,未經允許不得轉載:
由於在項目中用到了向上查詢父節點的遞歸查詢和向下查詢子節點查詢的遞歸查詢,由於在實現過程中,寫遞歸查詢的sql函數
花費了較長的時間,所以在此總結一下,兩種遞歸查詢的函數的實現寫法:
向下查詢子節點的遞歸查詢:
先展示表結構:
根據區域查詢對應的下級區域信息,其中parentId為zoneId對應的下級區域id信息。當再查詢下級區域信息時,即可將parentID作為zoneId來
查詢子節點信息,由於不同區域對應的子節點層數也不一樣,當要獲取所有子節點的zoneId時,可以使用以下的遞歸查詢:
BEGIN DECLARE sTemp VARCHAR(10000); DECLARE sTempChd VARCHAR(10000); SET sTemp = '$'; SET sTempChd =CAST(rootId AS CHAR); WHILE sTempChd IS NOT NULL DO SET sTemp = CONCAT(sTemp, ',', sTempChd); SELECT GROUP_CONCAT(zoneid) INTO sTempChd FROM tbl_zone_info WHERE STATUS!='3' and FIND_IN_SET(parentid,sTempChd)>0; END WHILE; RETURN sTemp; END
使用方式:
向上查詢的父查詢遞歸查詢:
先展示表結構:
根據組id查詢對應的父組有哪些:parentId即為對應groupId組id的父組id,當獲取到父組id即parentid,即可以將parentId作為groupId組id
查詢到父組的信息。
實現的遞歸函數為:
BEGIN DECLARE fid varchar(100) default ''; DECLARE str varchar(1000) default rootId; WHILE rootId is not null do SET fid =(SELECT PARENTID FROM tbl_group_info WHERE GROUPID = rootId); IF fid is not null THEN SET str = concat(str, ',', fid); SET rootId = fid; ELSE SET rootId = fid; END IF; END WHILE; return str; END
使用方式:
當得知層級關系時,可以直接使用以下sql,進行自我聯查:
select a.GROUPNAME AS lev1,b.GROUPNAME AS lev2,c.GROUPNAME AS lev3,d.GROUPNAME AS lev4 from tbl_group_info a
LEFT JOIN tbl_group_info b ON a.PARENTID = b.GROUPID
LEFT JOIN tbl_group_info c ON b.PARENTID = c.GROUPID
LEFT JOIN tbl_group_info d ON c.PARENTID = d.GROUPID
where a.GROUPID = '320100201712010942533991024gleax'