MySql 递归查询

Posted 整合侠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySql 递归查询相关的知识,希望对你有一定的参考价值。

mysql 递归查询

一、递归语句

-- 向下递归函数
SELECT GROUP_CONCAT(\'\'\'\', pk_dept , \'\'\'\')  FROM rz.dept WHERE FIND_IN_SET(fr_pk_dept,\'1070\')>0;

结果:

设置某个部门下的所有子部门为无效:

update rz.dept set zt =\'0\' WHERE FIND_IN_SET(fr_pk_dept,\'部门ID\')>0;

二、自定义递归函数

利用find_in_set()函数和group_concat()函数实现递归查询:

1,向下递归:

DROP FUNCTION IF EXISTS queryChildrenAreaInfo;
CREATE FUNCTION queryChildrenAreaInfo(areaId INT) -- 或者 areaId char
RETURNS VARCHAR(4000)
BEGIN
DECLARE sTemp VARCHAR(4000);
DECLARE sTempChd VARCHAR(4000);

SET sTemp=\'$\';
SET sTempChd = CAST(areaId AS CHAR);

WHILE sTempChd IS NOT NULL DO
SET sTemp= CONCAT(sTemp,\',\',sTempChd);
SELECT GROUP_CONCAT(id) INTO sTempChd FROM t_areainfo WHERE FIND_IN_SET(parentId,sTempChd)>0;
END WHILE;
RETURN sTemp;
END;

调用方式:

SELECT * FROM t_areainfo WHERE FIND_IN_SET(id,queryChildrenAreaInfo(4));

2,向上递归:

DROP FUNCTION IF EXISTS queryChildrenAreaInfo1;
CREATE FUNCTION queryChildrenAreaInfo1(areaId INT)
RETURNS VARCHAR(4000)
BEGIN
DECLARE sTemp VARCHAR(4000);
DECLARE sTempChd VARCHAR(4000);

SET sTemp=\'$\';
SET sTempChd = CAST(areaId AS CHAR);
SET sTemp = CONCAT(sTemp,\',\',sTempChd);

SELECT parentId INTO sTempChd FROM t_areainfo WHERE id = sTempChd;
WHILE sTempChd <> 0 DO
SET sTemp = CONCAT(sTemp,\',\',sTempChd);
SELECT parentId INTO sTempChd FROM t_areainfo WHERE id = sTempChd;
END WHILE;
RETURN sTemp;
END;

调用方式:

SELECT * from t_areainfo where FIND_IN_SET(id,queryChildrenAreaInfo1(7));

 

以上是关于MySql 递归查询的主要内容,如果未能解决你的问题,请参考以下文章

mysql中递归查询的实现

mysql递归查询语句

mysql查询一个表,实现递归查询

mysql递归查询

MySQL怎样做递归查询

mysql怎么实现递归查询数据