mysql 自定义过程_MySQL自定义函数

查询所有树状数据的后代节点

代码中a.centerid 为本身的唯一标示,a.parentcentid为父id标示 比如传入1 ,查出2,3,4,5,6

1

2     3

4     5       6

drop FUNCTION if existsqueryChildrenCenters;create function queryChildrenCenters(centerid VARCHAR(31))returns VARCHAR(4000)BEGIN

declare sTemp VARCHAR(4000);declare sTempid VARCHAR(4000);SET sTemp = '';set sTempid =centerid;while sTempid is not nullDOselect group_concat(a.centerid) INTO sTempid from sys_center a where find_in_set(a.parentcentid,sTempid) > 0;IF (sTempid is NULL ) THEN

set sTemp =sTemp;ELSE

set sTemp = concat(stemp,',',sTempid);END IF;END WHILE;set sTemp = substring(sTemp,2);returnsTemp;END;

2.查询所有后代id和名字的存储过程

CREATE PROCEDURE queryChildrenCenterIdAndName(IN centerid VARCHAR(31))BEGIN

declare sTemp VARCHAR(4000);declare sTempid VARCHAR(4000);declare sTempNames VARCHAR(4000);declare tempName VARCHAR(4000);SET sTemp = '';set sTempNames = '';set sTempid =centerid;while sTempid is not nullDOselect group_concat(a.centerid),group_concat(a.centername) INTO sTempid,tempName from sys_center a where find_in_set(a.parentcentid,sTempid) > 0;IF (sTempid is NULL ) THEN

set sTemp =sTemp;set sTempNames =sTempNames;ELSE

set sTemp = concat(stemp,',',sTempid);set sTempNames = concat(sTempNames,',',tempName);END IF;END WHILE;set sTemp = substring(sTemp,2);set sTempNames = substring(sTempNames,2);select sTemp as centerids,sTempNames ascenternames;END;

ps: 查询的id还可以,查询出来的名称少了数据,还望大佬指点

关于group_concat函数:

group_concat数据量小的时候没什么问题,但是数据量大的时候就有问题了;

group_concat:默认可连接的长度是1024;如果已经设置了最大长度,超过这个长度就会被截取至这个长度;

在查询(select)语句中,使用了group_concat之后,limit就会失效;

解决方法:

1、修改MySQL的配置文件windows下my.ini文件:

#需要设置的长度

group_concat_max_len = 102400

以上设置Mysql最大长度设置,

mysql> show variables like "%concat%"; 命令查了一下,数据量挺长的。

注意LINUX 设置需要在/etc/my.cnf  且需要设置位置在 需要有管理员权限才可以操作GLOBAL;

我在存储过程中采用了上面的第三种办法,执行存储过程,OK,完美搞定!

但是有时候我们在生产环境中最好是使用前面两种,尽量避免线上重启数据库服务解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值