MySql 递归查询函数

创建向下递归函数queryParentAreaInfo

DELIMITER $$
USE `commonresource`$$
DROP FUNCTION IF EXISTS `queryParentAreaInfo`$$

CREATE DEFINER=`root`@`%` FUNCTION `queryParentAreaInfo`(tablename VARCHAR(4000), _id VARCHAR(4000)) RETURNS VARCHAR(4000) CHARSET utf8
BEGIN
DECLARE oTemp VARCHAR (4000);
DECLARE oTempChild VARCHAR (4000);
SET oTemp = '';
SET oTempChild = CAST(_id AS CHAR);
IF tableName = 't_area'  THEN  
WHILE oTempChild <> 0 DO
SET oTemp = CONCAT(oTemp, ',', oTempChild);
SELECT parent_code INTO oTempChild FROM t_area WHERE area_code = oTempChild;
END WHILE;
END IF;

RETURN oTemp;
END$$

DELIMITER ;

创建向上递归函数queryParentAreaInfo

DELIMITER $$

USE `commonresource`$$

DROP FUNCTION IF EXISTS `queryParentAreaInfo`$$

CREATE DEFINER=`root`@`%` FUNCTION `queryParentAreaInfo`(tablename VARCHAR(4000), _id VARCHAR(4000)) RETURNS VARCHAR(4000) CHARSET utf8
BEGIN
DECLARE oTemp VARCHAR (4000);
DECLARE oTempChild VARCHAR (4000);
SET oTemp = '';
SET oTempChild = CAST(_id AS CHAR);
IF tableName = 't_area'  THEN  
WHILE oTempChild <> 0 DO
SET oTemp = CONCAT(oTemp, ',', oTempChild);
SELECT parent_code INTO oTempChild FROM t_area WHERE area_code = oTempChild;
END WHILE;
END IF;
RETURN oTemp;
END$$

DELIMITER ;

使用方式

第一种方式:SELECT * FROM t_area WHERE FIND_IN_SET(area_code,queryChildrenAreaInfo('t_area','530500000000'));
此处查询执行速度非常慢,用下面方式优化,即:先创建,临时表来存储函数查询的结果,再拼接SQL语句
优化后方式:SELECT * FROM t_area,(SELECT queryChildrenAreaInfo('t_area','530500000000') cids) t WHERE FIND_IN_SET(area_code,cids);

猜你喜欢

转载自blog.csdn.net/Street_Walker/article/details/88573447
今日推荐