查询所有树状数据的后代节点
代码中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,完美搞定!
但是有时候我们在生产环境中最好是使用前面两种,尽量避免线上重启数据库服务解决。