mysql递归查询函数

获取祖先区划列表

-- 获取祖先区划列表
CREATE DEFINER=`root`@`%` FUNCTION `getParentList`(`rootId` varchar(10000)) RETURNS varchar(10000) CHARSET utf8
    DETERMINISTIC
BEGIN
		DECLARE sParentList VARCHAR(10000); -- 父区划集(上面所有层的父区划合集)
		DECLARE sParentTemp VARCHAR(10000); -- 区划缓存
		-- 查出上一层层父区划赋值给区划缓存
		SELECT GROUP_CONCAT(parentid) INTO sParentTemp FROM T_SYS_REGION WHERE areaid = rootId;
		-- 如果区划缓存不为空
		WHILE sParentTemp IS NOT NULL DO
				-- 为父区划集赋值(如果父区划集不为空则在前面加上区划缓存,否则赋值区划缓存)
				IF(sParentList IS NOT NULL) THEN
					SET sParentList = CONCAT(sParentTemp,',',sParentList);
				ELSE
					SET sParentList = sParentTemp;
				END IF;
				-- 在当前n层父区划的基础上查出上n+1层的父区划赋值给区划缓存
				SELECT GROUP_CONCAT(parentid) INTO sParentTemp FROM T_SYS_REGION WHERE FIND_IN_SET(areaid,sParentTemp)>0;
		END WHILE;
		RETURN sParentList;
END

获取所有后代区划列表

-- 获取所有后代区划列表
CREATE DEFINER=`root`@`%` FUNCTION `getChildreList`(`rootId` varchar(10000)) RETURNS varchar(10000) CHARSET utf8
    DETERMINISTIC
BEGIN
    DECLARE sChildrenList VARCHAR(10000); -- 子区划集(下面所有层的子区划合集)
    DECLARE sChildrenTemp VARCHAR(10000); -- 区划缓存
		-- 查出下一层子区划赋值区划缓存
		SELECT GROUP_CONCAT(AREAID) INTO sChildrenTemp FROM T_SYS_REGION WHERE PARENTID = rootId;
		-- 如果区划缓存不为空
    WHILE sChildrenTemp IS NOT NULL DO
				-- 为子区划集赋值(如果子区划集不为空则在前面加上区划缓存,否则赋值区划缓存)
				IF (sChildrenList IS NOT NULL)
				THEN
						SET sChildrenList = CONCAT(sChildrenTemp, ',', sChildrenList);
				ELSE
						SET sChildrenList = CONCAT(sChildrenTemp);
				END IF;
				-- 在当前n层子区划的基础上查出下n+1层的子区划赋值给区划缓存
				SELECT GROUP_CONCAT(AREAID) INTO sChildrenTemp FROM T_SYS_REGION WHERE FIND_IN_SET(PARENTID, sChildrenTemp) > 0;
		END WHILE;
    RETURN sChildrenList;
END

查出上线下树区划列表

-- 查出上线下树区划列表
CREATE DEFINER=`root`@`%` FUNCTION `getAreaIds`(`rootId` varchar(10000)) RETURNS varchar(10000) CHARSET utf8
    DETERMINISTIC
BEGIN
		DECLARE areaIds VARCHAR(10000);
				SELECT CONCAT_WS(',',getParentList(rootId),rootId,getChildreList(rootId)) INTO areaIds;
		RETURN areaIds;
END
原文地址:https://www.cnblogs.com/jiangdewen/p/15115162.html