1. 程式人生 > >group_concat()加上order by/group by會被擷取字串的解決辦法

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也會有聯絡。☺☺