MySQL 中和 group by 一起用的函式,如果我們要算數值的總和或平均,可以使用 sum() 或 avg() 。
但是我們如果要在 group by 中把字串「黏起來」,不是使用 concat(),而是使用另一個函式:group_concat()。
GROUP_CONCAT()是MySQL數據庫提供的一個函數,通常跟GROUP BY一起用,可參考MySQL官方文件[1]
以下是官網上的範例和語法:
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;
4. 一個使用的範例:
簡單的範例
要選擇表單中的村莊名:
然後取完再用迴圈相黏成一個字串,這未免也太麻煩了,所以改成一行寫好,取出來用空白分格,等於選取某欄變字串:
結果
大都城村,辛北庄村,辛南庄村,辛西庄村
這樣就能一次取出一行結果的字串,非常方便。
複雜的範例
目的為了呈現多個條件的 SQL 語法。此 SQL 目的是要依供貨商分類取出貨品,並把貨品的流水號產生一個連結的字串 `gdsrec`,並把貨品總價寫成個一值 `sum`
table1: goods 貨品
gsn 流水號
pID 供貨商
price 單價
state 狀態
table2: provider 供貨商
pID 流水號
pname 名稱
關聯 `goods`.`pID` <-> `provider`.`pID`
SELECT `g`.`pID` , `p`.`pname` , group_concat( `g`.`gsn` order by `g`.`gsn` SEPARATOR ',' ) AS `gdsrec` , sum( `g`.`price` ) AS `sum`FROM `goods` AS `g` LEFT JOIN `provider` AS `p`USING ( `pID` ) WHERE `g`.`state` =1GROUP BY `g`.`pID` ORDER BY `g`.`pID`LIMIT 0 , 30
結果:
pID | pname | gdsrec | sum |
---|---|---|---|
1 | 河馬公司 | 94,94,94,259 | 13947 |
2 | 瘦比八企業社 | 381,381 | 500 |
3 | 張氏企業 | 734,734,734 | 36 |
參考資料
[1] http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat
原文 2010-03-01 11:09:35