创建向下递归函数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);