1. 程式人生 > >【MySQL】CONCAT 和 GROUP_CONCAT

【MySQL】CONCAT 和 GROUP_CONCAT

今天做專案時遇到這樣一個需求:資料庫有一張album相簿表和一張image照片表,頁面要顯示的是相簿的名稱和該相簿下所有的照片(一個相簿包括好幾張照片):
相簿表:

照片表:

第一次嘗試:這樣可以發現相簿名稱會重複很多

第二次嘗試:使用GROUP_CONCAT函式,這樣就可以將相簿下的所有照片顯示在對應的一個相簿了

這樣在前端對photo分割,顯示每張照片,如下:

下面介紹MySQL的兩個函式:

CONCAT()函式

【作用】
  將多個欄位連結成一個字串(主要用於連線不同欄位的)

【使用方法】

  • 預設連線欄位之間沒有分隔符:
  • 使用特定分隔符分割,如使用“,”逗號分割,使用CONCAT_WS()函式:

  這個函式實際中還沒用過,但可定不是永遠我上面舉得例子,應該是這樣的:表中有姓firstName欄位和名稱lastName欄位,但返回結果要姓名,這時就可以用CONCAT()函式

【注意】

  • 網上說當要連線的欄位中有一個欄位的值為Null時,組合後的字串就是NULL,但本人實驗後並不是這樣的,只是把為NULL的欄位顯示為NULL,其它的欄位正常顯示
  • oracle中CONCAT()只能連線兩個欄位,要想連線多個,可以巢狀使用CONCAT()

GROUP_CONCAT()函式

【作用】
  將分組中的值連線成一個字串(所以要結合GROUP BY 使用),將該字串返回(主要用於分組顯示的)

【使用方法】

  • 預設連線欄位之間用“,”逗號分隔:
  • 使用特定分隔符分割,如用“-”分割,這樣將album_id和image組合到一起,並且以album_id分組顯示
  • 聯和使用GROUP_CONCAT和CONCAT
  • 可以限制連線後字串的最大長度,超出這個長度後欄位擷取設定的最大長度的字串,需要對系統引數進行設定:SET
    @@global.group_concat_max_len=40000;
  • 對連線後的分組字串使用DISTINCT去重,這樣就可以去掉重複的組合只保留一個相同組合
SELECT album_id,GROUP_CONCAT(DISTINCT image)  photo    
FROM
image GROUP BY album_id
  • 對組合字串進行排序,及組合字串顯示的順序(欄位組合順序不變):
SELECT album_id,GROUP_CONCAT( album_id,id ORDER BY id ASC)  photo    
FROM image 
GROUP BY album_id