MySQL存储过程,树状结构数据查询

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))

BEGIN
	SET 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 DO
		IF result != '' THEN
			SET result = concat(result,',',@sTempChd);
		ELSE
			SET 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))

BEGIN
	SET 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 != '' THEN
			SET result = concat(result,',',@sTempPar);
		ELSE
			SET result = @sTempPar;
		END IF;
		PREPARE stmt FROM @sqlcmd;  
		EXECUTE stmt; 
	END WHILE;
	select result;
END

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值