mysql 查询父级节点,MySQL父子节点查询

MySQL父子结点递归查询

表结构:

1 CREATE TABLE `agency` (

2 `id` varchar(32) NOT NULL COMMENT '编号',

3 `name` varchar(30) NOT NULL COMMENT '名称',

4 `addr` varchar(100) NOT NULL COMMENT '位置',

5 `pId` varchar(32) DEFAULT NULL COMMENT '父ID',

6 PRIMARY KEY (`id`)

7 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

表数据:

fb2ed9f9672c53dac37f5067762a5880.png

查询子结点的所有父结点:

添加函数:findParent

1 CREATE FUNCTION `findParent`(`subId` varchar(32)) RETURNS varchar(4000)

2 BEGIN

3 DECLARE sTemp VARCHAR(1000);

4 DECLARE sTempPar VARCHAR(1000);

5 SET sTemp = '';

6 SET sTempPar =subId;

7 #循环递归

8 WHILE sTempPar is not null DO

9 #判断是否是第一个,不加的话第一个会为空

10 IF sTemp != '' THEN

11 SET sTemp = concat(sTemp,',',sTempPar);

12 ELSE

13 SET sTemp = sTempPar;

14 END IF;

15 SET sTemp = concat(sTemp,',',sTempPar);

16 SELECT group_concat(pid) INTO sTempPar FROM agency where pid<>id and FIND_IN_SET(id,sTempPar)>0;

17 END WHILE;

18 RETURN sTemp;

19 END

调用示例:

1 select * from agency where FIND_IN_SET(id,findParent('6'))

显示结果:

83b4f1e75bbd80df25bac855e56a6e6d.png

查询根结点的所有子结点:

添加函数:findSubNode

1 CREATE FUNCTION `findSubNode`(`orgid` varchar(32)) RETURNS varchar(4000)

2 BEGIN

3 DECLARE oTemp VARCHAR(4000);

4 DECLARE oTempChild VARCHAR(4000);

5 SET oTemp = '';

6 SET oTempChild = orgid;

7 WHILE oTempChild IS NOT NULL

8 DO

9 SET oTemp = CONCAT(oTemp,',',oTempChild);

10 SELECT GROUP_CONCAT(id) INTO oTempChild FROM agency WHERE FIND_IN_SET(pId,oTempChild) > 0;

11 END WHILE;

12 RETURN oTemp;

13 END

调用示例:

1 select * from agency where FIND_IN_SET(id,findSubNode('2'))

显示结果:

81099e820f45e4e610bcc2f02c013123.png

标签:sTempPar,SET,varchar,查询,sTemp,MySQL,id,oTempChild,节点

来源: https://www.cnblogs.com/wdzhz/p/10748765.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值