1. 根据父级节点id查询其所有的子级节点id,查询结果中包含当前传入的父级节点id值
#根据传入的父级id查询所有子节点的id#tableName 表名#idKey 节点标识#pIdKey 父节点标识#pId 父节点id值#调用示例 call get_child_nodes('org','id','pid',213,@result);CREATE PROCEDURE `get_child_nodes`(IN `tableName` VARCHAR(100),IN `idKey` VARCHAR(50),IN `pIdKey` VARCHAR(50),IN `pId` VARCHAR(100),OUT `result` VARCHAR(10000))BEGINSET result = '';SET @sTempChd = pId;SET @sqlcmd = CONCAT('SELECT group_concat(',idKey,') INTO @sTempChd FROM ',tableName,' where FIND_IN_SET(',pIdKey,',@sTempChd)>0;');WHILE @sTempChd is not null DOIF result != '' THENSET result = concat(result,',',@sTempChd);ELSESET result = @sTempChd;END IF;PREPARE stmt FROM @sqlcmd; EXECUTE stmt; END WHILE;select result;END
2. 根据当前节点id查询其所有的父级节点id,查询结果中包含当前传入的节点id值
#根据传入的节点id查询所有父节点的id#tableName 表名#idKey 节点标识#pIdKey 父节点标识#id 当前节点id值#调用示例 call get_parent_nodes('org','id','pid',213,@result);CREATE PROCEDURE `get_parent_nodes`(IN `tableName` VARCHAR(100),IN `idKey` VARCHAR(50),IN `pIdKey` VARCHAR(50),IN `id` VARCHAR(100),OUT `result` VARCHAR(10000))BEGINSET result = '';SET @sTempPar = id; SET @sqlcmd = CONCAT('SELECT group_concat(',pIdKey,') INTO @sTempPar FROM ',tableName,' where ',pIdKey,'<>',idKey,' and FIND_IN_SET(',idKey,',@sTempPar)>0;');#循环递归WHILE @sTempPar is not null DO #判断是否是第一个,不加的话第一个会为空IF result != '' THENSET result = concat(result,',',@sTempPar);ELSESET result = @sTempPar;END IF;PREPARE stmt FROM @sqlcmd; EXECUTE stmt; END WHILE;select result;END