最近作項目遇到地區查詢問題,涉及遞歸,在java代碼中處理髮現效率較低,遂考慮使用sql遞歸java
貼上一張表結構:sql
1、查詢下級方法spa
CREATE FUNCTION getChildrenOrg (orgid INT) RETURNS VARCHAR (4000) BEGIN DECLARE oTemp VARCHAR (4000); DECLARE oTempChild VARCHAR (4000); SET oTemp = ''; SET oTempChild = CAST(orgid AS CHAR); WHILE oTempChild IS NOT NULL DO SET oTemp = CONCAT(oTemp, ',', oTempChild); SELECT GROUP_CONCAT(areaid) INTO oTempChild FROM area WHERE FIND_IN_SET(parentid, oTempChild) > 0; END WHILE; RETURN oTemp; END
調用方法(查詢areaid爲620000(甘肅)的地區的所有下級)code
SELECT * FROM area WHERE FIND_IN_SET( areaid, getChildrenOrg (620000) )
結果:遞歸
1、查詢上級方法get
SELECT * FROM ( SELECT @r AS _id, (SELECT @r := parentid FROM area WHERE areaid = _id) AS parent_id, @l := @l + 1 AS lvl FROM (SELECT @r := 330324, @l := 0) vars, area h WHERE @r <> 0) T1 JOIN area T2 ON T1._id = T2.areaid ORDER BY areaid;
注意其中的330324就是子節點areaidclass
結果以下:效率