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:查询ID为7上面的所有节点SELECT * from t_areainfo where FIND_IN_SET(id,queryChildrenAreaInfo1(7));