首页 > 数据库技术 > 详细

MySQL父子节点查询

时间:2019-04-22 10:59:55      阅读:205      评论:0      收藏:0      [点我收藏+]

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;

表数据:

技术分享图片

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

添加函数: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)) 

显示结果:

技术分享图片

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

添加函数: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)) 

显示结果:

技术分享图片

 

MySQL父子节点查询

原文:https://www.cnblogs.com/wdzhz/p/10748765.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!