MySql 遞歸查詢
一、遞歸語句
-- 向下遞歸函數 SELECT GROUP_CONCAT('''', pk_dept , '''') FROM rz.dept WHERE FIND_IN_SET(fr_pk_dept,'1070')>0;
結果:
設置某個部門下的所有子部門為無效:
update rz.dept set zt ='0' WHERE FIND_IN_SET(fr_pk_dept,'部門ID')>0;
二、自定義遞歸函數
利用find_in_set()函數和group_concat()函數實現遞歸查詢:
1,向下遞歸:
DROP FUNCTION IF EXISTS queryChildrenAreaInfo; CREATE FUNCTION queryChildrenAreaInfo(areaId INT) -- 或者 areaId char RETURNS VARCHAR(4000) BEGIN DECLARE sTemp VARCHAR(4000); DECLARE sTempChd VARCHAR(4000); SET sTemp='$'; SET sTempChd = CAST(areaId AS CHAR); WHILE sTempChd IS NOT NULL DO SET sTemp= CONCAT(sTemp,',',sTempChd); SELECT GROUP_CONCAT(id) INTO sTempChd FROM t_areainfo WHERE FIND_IN_SET(parentId,sTempChd)>0; END WHILE; RETURN sTemp; END;
調用方式:
SELECT * FROM t_areainfo WHERE FIND_IN_SET(id,queryChildrenAreaInfo(4));
2,向上遞歸:
DROP FUNCTION IF EXISTS queryChildrenAreaInfo1; CREATE FUNCTION queryChildrenAreaInfo1(areaId INT) RETURNS VARCHAR(4000) BEGIN DECLARE sTemp VARCHAR(4000); DECLARE sTempChd VARCHAR(4000); SET sTemp='$'; SET sTempChd = CAST(areaId AS CHAR); SET sTemp = CONCAT(sTemp,',',sTempChd); SELECT parentId INTO sTempChd FROM t_areainfo WHERE id = sTempChd; WHILE sTempChd <> 0 DO SET sTemp = CONCAT(sTemp,',',sTempChd); SELECT parentId INTO sTempChd FROM t_areainfo WHERE id = sTempChd; END WHILE; RETURN sTemp; END;
調用方式:
SELECT * from t_areainfo where FIND_IN_SET(id,queryChildrenAreaInfo1(7));