mysql递归

1、向下递归

delimiter $$ 
drop function if exists get_child_list$$ 
create function get_child_list(in_id varchar(100)) returns varchar(1000) 
begin 
 declare ids varchar(1000) default ''; 
 declare tempids varchar(1000); 
 
 set tempids = in_id; 
 while tempids is not null do 
  set ids = CONCAT_WS(',',ids,tempids); 
  select GROUP_CONCAT(id) into tempids from 表名 where FIND_IN_SET(pid,tempids)>0;  
 end while; 
 return ids; 
end  
$$ 
delimiter ;

Eg:查询ID为4下面的所有节点SELECT * FROM t_areainfo WHERE FIND_IN_SET(id,get_child_list(节点ID));

2.、向上递归

DROP FUNCTION IF EXISTS queryChildrenAreaInfo1;DELIMITER;;
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;;DELIMITER ;

Eg:查询ID7上面的所有节点SELECT * from t_areainfo where FIND_IN_SET(id,queryChildrenAreaInfo1(7));

原文地址:https://www.cnblogs.com/ThisYbc/p/15064381.html