2014年7月11日 星期五

[MySQL]多列合併 GROUP_CONCAT 函數

MySQL 中和 GROUP BY 一起用的函式,如果我們要算數值的總和或平均,可以使用 SUM() 或 AVG() 。但是我們如果要在 GROUP BY 中把字串「黏起來」,不是使用 CONCAT(),而是使用另一個函式:GROUP_CONCAT()。


GROUP_CONCAT()是MySQL數據庫提供的一個函數,通常跟GROUP BY一起用,可參考MySQL官方文件

以下是官網上的範例和語法:

GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val])
mysql> SELECT student_name,
    ->     GROUP_CONCAT(test_score)
    ->     FROM student
    ->     GROUP BY student_name;
Or:
mysql> SELECT student_name,
    ->     GROUP_CONCAT(DISTINCT test_score
    ->               ORDER BY test_score DESC SEPARATOR ' ')
    ->     FROM student
    ->     GROUP BY student_name;

以下為注意重點:

  1.  group_concat 中其實可放另一個SQL的語法。其中,若要排除重覆的值,則加入關鍵字 DISTINCT;若要讓相黏的內容排序,可以在 group_concat 中使用 ORDER BY 關鍵字;而 SEPARATOR 用來作為字串相黏的分隔符號。
  2. 如果相黏的字串中有NULL值,他就會回傳NULL值,這裡要特別注意。
  3. 產生的值資料型態是 BLOB,他的最大長度是由系統變數  group_concat_max_len 決定,預設是1024bytes;此外有效的最大長度由  max_allowed_packet 系統變數所限制。如果在執行期要修改限制,可使用以下的SQL:

    SET [GLOBAL | SESSION] group_concat_max_len = val;

參考資料:精讚部落

沒有留言:

張貼留言