mysql树形结构遍历

本文介绍了一种通过自定义MySQL函数实现树形结构中节点的子节点和父节点遍历的方法。首先创建了树形表结构,并通过递归方式实现了获取指定节点的所有子节点和父节点的功能。

   课题:如何利用mysql遍历树形结构(获取一个节点的所有子节点/父节点)


   方案:自定义mysql函数


   树形表结构

CREATE TABLE `tbl_tree` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `father_id` bigint(20) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `father_id` (`father_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

  自定义mysql函数函数

          1. 获取节点的子节点

CREATE FUNCTION `getChildLst`(rootId INT)
RETURNS varchar(1000)
BEGIN
DECLARE sTemp VARCHAR(1000);
DECLARE sTempChd VARCHAR(1000);

SET sTemp = '';
SET sTempChd =cast(rootId as CHAR);

loop1:LOOP
SELECT group_concat(id) INTO sTempChd FROM tbl_tree where FIND_IN_SET(father_id,sTempChd)>0;
IF sTempChd is not null THEN
SET sTemp = concat(sTemp,',',sTempChd);
ELSE
LEAVE loop1;
END IF;
END LOOP;

SET sTemp = TRIM(',' FROM sTemp);
RETURN sTemp;
END

          2. 获取节点的父节点

CREATE FUNCTION `getFatherLst`(rootId INT)
RETURNS varchar(1000)
BEGIN
DECLARE sTemp VARCHAR(1000);
DECLARE sTempPrt VARCHAR(1000);

SET sTemp = '';
SET sTempPrt = cast(rootId as CHAR);

loop1:LOOP
SELECT group_concat(father_id) INTO sTempPrt FROM tbl_tree where FIND_IN_SET(id,sTempChd)>0;
IF sTempPrt is not null THEN
SET sTemp = concat(sTemp,',',sTempPrt);
ELSE
LEAVE loop1;
END IF;
END LOOP;

SET sTemp = TRIM(',' FROM sTemp);
RETURN sTemp;
END

  优化后的查询语句:

          1. 获取子节点

select A.* from tbl_tree A inner join (select getChildLst(1) as idArr) TEMP where FIND_IN_SET(A.id, TEMP.idArr);
          1. 获取父节点

select A.* from tbl_tree A inner join (select getFatherLst(15000) as idArr) TEMP where FIND_IN_SET(A.id, TEMP.idArr);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值