MySQL 递归

MySql 递归

base_area 表结构

  • base_area.code varchar(20)
  • base_area.name varchar(20)

创建函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
-- 地区 递归查询
-- 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 ;

使用

1
SELECT queryChildrenAreaInfo(320117,1);

本文标题:MySQL 递归

文章作者:史彦超

发布时间:2016年10月11日 - 22:10

最后更新:2021年07月20日 - 16:07

原始链接:https://doingself.github.io/2016/10/11/2016-10-11-MySql-%E9%80%92%E5%BD%92/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Donate comment here