- 查询所有树状数据的后代节点
代码中a.centerid 为本身的唯一标示,a.parentcentid为父id标示 比如传入1 ,查出2,3,4,5,6
1
2 3
4 5 6
drop FUNCTION if exists queryChildrenCenters; 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 null DO select 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); return sTemp; 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 null DO select 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 as centernames; END;
ps: 查询的id还可以,查询出来的名称少了数据,还望大佬指点
转载: https://www.cnblogs.com/angelasp/p/groupconcat.html
关于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,完美搞定!
但是有时候我们在生产环境中最好是使用前面两种,尽量避免线上重启数据库服务解决。