group_concat()加上order by/group by会被截取字符串的解决办法

前言

最近,楼主碰到个问题,就是使用group_concat()拼接字符串查询的时候,若长度有点长,则会被截取。但是查了mysql里面限制的最长的group_concat()长度,并没有超出。最后发现是因为查询语句最后加上了order by或者group by导致的。

环境

我本地的mysql版本是:
mysql版本1
我这边查询出来会进行截取,但是我同事的不会,他的版本是:5.7.14。
Navicat版本我们都是:11.1.8(64-bit)。所以猜测出现该问题原因是和mysql版本有关。

group_concat()函数限制的最大长度

select @@global.group_concat_max_len;

可以使用上面那条语句查询限制长度,如果是使用Navicat的话,可以新建查询,然后再查。我的查询结果是1024。
group_concat()最大长度
这个长度是可以修改的,具体可以百度。

问题重现

我的查询语句是:

select
        a.id as id,
        (select group_concat(d.img_url) from t_dt_img d where a.answer_id=d.answer_id) as answerImgList,
        length((select group_concat(d.img_url) from t_dt_img d where a.answer_id=d.answer_id)) as answerImgListLength
from 
        t_dt_teacheranswer_buy a,t_dt_teacher b,t_dt_teacherAnwser c
where 
            b.delete_flag=0 and c.delete_flag=0 and b.id=c.teacher_id and c.id=a.answer_id
order by a.id desc;

group_concat()使用的是子查询

查询结果如下:(加group by同样会被截取
查询结果
最后一张图片的url本来是:

/filepathmap/answer/answerImage/8db1b114-53c8-47e2-ba93-800a7b5554ce.png

在图中可以看到,到e就被截取了,然后我把这串被截取的字符串重新进行长度查询:
查询长度
这里显示只有341,但是上面的查询语句出来是364。也就是说,可能是显示的时候被截取了或者是其他情况。

使用不加order by的语句查询:
不加order by
可以看到能够全部查出来。

解决办法

通过在网上查询,没有说过group_concat后面加了order by或者group by会进行截取字符串的情况。于是我尝试修改语句的写法。最终,改成如下情况可以实现加上order by/group by不会截取字符串的结果。

select
        a.id as id,
        group_concat(d.img_url) as answerImgList,
        length(group_concat(d.img_url)) as answerImgListLength
from 
        t_dt_teacheranswer_buy a left join t_dt_img d on a.answer_id=d.answer_id,
        t_dt_teacher b,t_dt_teacherAnwser c
where 
            b.delete_flag=0 and c.delete_flag=0 and b.id=c.teacher_id and c.id=a.answer_id
group by a.id
order by a.id desc;

运行结果如下:
正确的运行结果
可以看到,最后一张图片的url能够全部查询出来,进行长度查询,也是364。
关键是将group_concat()的查询条件也放到where后面!

结语

不知道为什么这个版本的mysql会出现这个情况,我是用远端的mysql查询也一样会被截取。远端的mysql版本是5.7.16。而且我和同事都是直接查询远端的数据库,但是我们本地结果显示的不一样。我目前猜测是,连接远端数据库进行查询的时候,和本地mysql也会有联系。☺☺

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值