Mysql-获取子结点所有父结点
分享一下mysql中获取子结点所有父结点,原始数据如下:
注意观察,根节点父结点为0,这是循环结束条件,下面看过程
DELIMITER $$
USE `usmsc` $$
DROP FUNCTION IF EXISTS `getParents` $$
CREATE DEFINER=`root`@`%` FUNCTION `getParents`(self_Id VARCHAR(40))
RETURNS VARCHAR(1000) CHARSET utf8 ##定义返回值类型 varchar(4000)
BEGIN ##函数开始
DECLARE sTemp text(40000); ##定义一个varchar类型的参数
DECLARE sTempName text(40000); ##定义一个varchar类型的参数
DECLARE sTempChd text(40000); ##定义一个varchar类型的参数
DECLARE counts int;
SET sTemp = ""; ##给sTmp赋值
SET sTempChd =self_Id; ##给sTempChd赋值
SET sTempName= ""; ##给sTempName赋值
SET counts = 0;
WHILE sTempChd !=0 DO ##循环体,循环终止条件为precinct_id=0,因为根节点默认上级为0
SELECT precinct_name INTO sTempName FROM usmsc.t_cfg_precinct WHERE precinct_id = sTempChd;
SET sTemp = CONCAT(sTempName,"/",sTemp);
##拼接sTemp
select count(*) INTO counts FROM usmsc.t_cfg_precinct WHERE precinct_id = sTempChd;
IF (counts=0) THEN
set sTempChd = NULL ;
else
SELECT up_precinct_id INTO sTempChd FROM usmsc.t_cfg_precinct WHERE precinct_id = sTempChd;
END IF;
##根据父节点,查询出该父节点下的所有子节点的id,支持多级查询
END WHILE;
RETURN left(sTemp,length(sTemp)-1);
END$$
DELIMITER
-- 查询条件
select t1.precinct_id,t1.precinct_name,t2.precinct_name,getParents(t1.precinct_id) as path from usmsc.t_cfg_precinct t1 left join usmsc.t_cfg_precinct t2 on t1.up_precinct_id = t2.precinct_id;
其实自己拿一个例子就很容易理解
1003–>父结点1002
1002–>父结点1001
1001–>父结点0(根节点)
套用上述过程即可验证,当然也可以按照实际随机应变