MySql 递归
base_area
表结构
base_area.code varchar(20)
base_area.name varchar(20)
创建函数
-- 地区 递归查询
-- DELIMITER 定好结束符为"$$", 然后最后又定义为";", MYSQL的默认结束符为";"
DELIMITER $$
DROP FUNCTION IF EXISTS queryChildrenAreaInfo$$
-- direction: 1=向下查询;2=向上查询
CREATE FUNCTION queryChildrenAreaInfo (rootId INT,direction INT) RETURNS VARCHAR(5000) CHARSET utf8
BEGIN
DECLARE sTemp VARCHAR(5000);
DECLARE sTempChd VARCHAR(5000);
SET sTemp = '$';
SET sTempChd =CAST(rootId AS CHAR);
IF direction=1 THEN
-- 向下查询
WHILE sTempChd IS NOT NULL DO
SET sTemp = CONCAT(sTemp,',',sTempChd);
-- GROUP_CONCAT() 返回一个字符串结果,该结果由分组中的值连接组合而成。
SELECT GROUP_CONCAT(CODE) INTO sTempChd FROM base_area
-- substring 截取字符串,获取parent code
WHERE 1=1 AND LENGTH(CODE) > 2 AND FIND_IN_SET(SUBSTRING(CODE,1,LENGTH(CODE)-2) , sTempChd) > 0 ;
END WHILE;
ELSEIF direction=2 THEN
-- 向上查询
WHILE sTempChd IS NOT NULL DO
SET sTemp = CONCAT(sTemp,',',sTempChd);
-- GROUP_CONCAT() 返回一个字符串结果,该结果由分组中的值连接组合而成。
SELECT GROUP_CONCAT(SUBSTRING(CODE,1,LENGTH(CODE)-2)) INTO sTempChd FROM base_area
WHERE 1=1 AND LENGTH(CODE) > 2 AND FIND_IN_SET( CODE, sTempChd) > 0 ;
END WHILE;
END IF;
RETURN sTemp ;
END $$
DELIMITER ;
使用
SELECT queryChildrenAreaInfo(320117,1);