MySQL自定义函数

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

代码中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,完美搞定!

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

posted @ 2018-10-16 17:16  泡沫幻影  阅读(431)  评论(0编辑  收藏  举报