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;

表數據:

查詢子結點的所有父結點:

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

顯示結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM