MySql 递归

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);

转载于:https://my.oschina.net/asjoker/blog/865615

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值