[精讚] [會員登入]
1037

[Mysql/Mariadb] GROUP_CONCAT 函數

MySQL 中和 group by 一起用的函式,如果我們要算數值的總和或平均,可以使用 sum() 或 avg() 。但是我們如果要在 group by 中把字串「黏起來」,不是使用 concat(

此文完整連結 http://n.sfs.tw/10849

複製連結 [Mysql/Mariadb] GROUP_CONCAT 函數@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2017-03-03 11:29:42 最後編修
2017-03-03 11:24:27 By 張○○
 

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. 一個使用的範例:

簡單的範例

要選擇表單中的村莊名:

SELECT village_name  from `village_table`

然後取完再用迴圈相黏成一個字串,這未免也太麻煩了,所以改成一行寫好,取出來用空白分格,等於選取某欄變字串:

SELECT group_concat(village_name  separator ',' ) from `village_table`

出來的結果

大都城村,辛北庄村,辛南庄村,辛西庄村

複雜的範例

目的為了呈現多個條件的 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

你可能感興趣的文章

[Mysql/MariaDB] 使用Memory引擎修改及設定最大值的方法 Mysql/MariaDB 使用Memory引擎預設是16MB,修改及設定最大值的方法。

Mysql 安裝完畢要做的事 Mysql 安裝完畢後,該處理的流程

[Mysql] 建立叢集式資料庫3/4 -- DB1設置及DB PROXY 使用galera建立Mysql的叢集式資料庫 ,繼續修正第1DB及運作PROXY

[MySQL/Mariadb] console 將查詢結果輸出到檔案 在mysql 的console中該如何將查詢結果輸出到檔案?

[Mysql] 建立叢集式資料庫4/4--觀察及測試 觀察及測試haproxy+galera建立Mysql的叢集式資料庫,並進行壓力測試

[Mysql/Mariadb] 建立使用者及資料庫 Mysql/Mariadb建立使用者、刪除使用者、給予權限、建立資料庫

[mysqldump] Mysqldump時出現記憶體錯誤Out of memory 當進行 mysqldump 時出現 Out of memory (Needed xxxxx bytes) 的錯誤,該如何處理?

[MySQL] FIND_IN_SET函數,把多筆條件判斷弄成字串 SQL 我們如果要查找某個欄位是否為某個值的時候,如果要判斷的條件很多,可以用這個函數

[Mysql/MariaDB] 修改資料庫、表格或欄位名稱 Mysql/MariaDB修改資料庫、表格或欄位名稱

[MariaDB] Centos 7安裝mariadb + apache + php + phpmyadmin Centos 7安裝mariadb+apache+php+phpmyadmin

我有話要說


限制:留言最高字數1000字,超過部分會被截掉。請注意:留言不可帶有網址,會被濾掉。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

[MAC] 截取螢幕畫面的方法 截取螢幕畫面的方法,在MAC中叫作螢幕快照,英文是screenshot

詭異的創業思維 創業的思維中,有多少銀彈,有多少技術,有多少人脈,有多少時間等等,每個都要考慮進去,以熱忱建立的關係脆弱的像蘇打餅乾一樣..

正則表達式:Email名稱防止連續輸入點(.)及下底線(_) Email的名稱中要允許特殊符號,但又不允許連續出現的正則表達式

[Wildfly10] 發佈war檔 deploy war file onto wildfly10

[AS3] FLASH 引入外部as檔 FLASH AS3中,若要引用另外撰寫的 class(*.as) 檔案,該如何處理?