学习成长

提供在线文档,方便大家学习


父子结点递归查询

<h1>表结构</h1> <pre><code>CREATE TABLE `agency` ( `id` varchar(32) NOT NULL COMMENT '编号', `name` varchar(30) NOT NULL COMMENT '名称', `addr` varchar(100) NOT NULL COMMENT '位置', `pId` varchar(32) DEFAULT NULL COMMENT '父ID', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;</code></pre> <h1>表数据</h1> <pre><code>select * from agency</code></pre> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/a0d372250d21da2aae497e45493b2a97?showdoc=.jpg" alt="" /></p> <h1>查询子结点的所有父结点</h1> <pre><code>CREATE FUNCTION `findParent`(`subId` varchar(32)) RETURNS varchar(4000) BEGIN DECLARE sTemp VARCHAR(1000); DECLARE sTempPar VARCHAR(1000); SET sTemp = ''; SET sTempPar =subId; #循环递归 WHILE sTempPar is not null DO #判断是否是第一个,不加的话第一个会为空 IF sTemp != '' THEN SET sTemp = concat(sTemp,',',sTempPar); ELSE SET sTemp = sTempPar; END IF; SET sTemp = concat(sTemp,',',sTempPar); SELECT group_concat(pid) INTO sTempPar FROM agency where pid&lt;&gt;id and FIND_IN_SET(id,sTempPar)&gt;0; END WHILE; RETURN sTemp; END</code></pre> <h1>调用示例</h1> <pre><code>select * from agency where FIND_IN_SET(id,findParent('6'))</code></pre> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/1320bbfd0b4edbe1a5937a4e91549eef?showdoc=.jpg" alt="" /></p> <h1>查询根结点的所有子结点</h1> <pre><code>CREATE FUNCTION `findSubNode`(`orgid` varchar(32)) RETURNS varchar(4000) BEGIN DECLARE oTemp VARCHAR(4000); DECLARE oTempChild VARCHAR(4000); SET oTemp = ''; SET oTempChild = orgid; WHILE oTempChild IS NOT NULL DO SET oTemp = CONCAT(oTemp,',',oTempChild); SELECT GROUP_CONCAT(id) INTO oTempChild FROM agency WHERE FIND_IN_SET(pId,oTempChild) &gt; 0; END WHILE; RETURN oTemp; END</code></pre> <h1>调用示例</h1> <pre><code>select * from agency where FIND_IN_SET(id,findSubNode('2'))</code></pre> <p><img src="https://www.showdoc.cc/server/api/common/visitfile/sign/f392ff322d356f1cf803286ef3aa7c02?showdoc=.jpg" alt="" /></p>

页面列表

ITEM_HTML