MySQL group_concat()函数
轉載自??MySQL group_concat()函數
MySQL GROUP_CONCAT函數介紹
MySQL?GROUP_CONCAT()函數將組中的字符串連接成為具有各種選項的單個字符串。
下面說明了GROUP_CONCAT()函數的語法:
GROUP_CONCAT(DISTINCT expressionORDER BY expressionSEPARATOR sep);以下是演示GROUP_CONCAT()函數如何工作的一個示例。
USE testdb; CREATE TABLE t (v CHAR );INSERT INTO t(v) VALUES('A'),('B'),('C'),('B');SELECT GROUP_CONCAT(DISTINCT vORDER BY v ASCSEPARATOR ';') FROMt; -- SELECT v FROM t GROUP BY v;執行上面查詢語句,得到以下結果 -
+---------------------------------------------------------------------+ | GROUP_CONCAT(DISTINCT vORDER BY v ASCSEPARATOR ';') | +---------------------------------------------------------------------+ | A;B;C | +---------------------------------------------------------------------+ 1 row in set?
注:上面語句類似于把SELECT v FROM t GROUP BY v;語句的結果串接起來。
參考以下圖解
?
?
DISTINCT子句用于在連接分組之前消除組中的重復值。
ORDER BY子句允許您在連接之前按升序或降序排序值。 默認情況下,它按升序排序值。 如果要按降序對值進行排序,則需要明確指定DESC選項。
SEPARATOR指定在組中的值之間插入的文字值。如果不指定分隔符,則GROUP_CONCAT函數使用逗號(,)作為默認分隔符。
GROUP_CONCAT函數忽略NULL值,如果找不到匹配的行,或者所有參數都為NULL值,則返回NULL。
GROUP_CONCAT函數返回二進制或非二進制字符串,這取決于參數。 默認情況下,返回字符串的最大長度為1024。如果您需要更多的長度,可以通過在SESSION或GLOBAL級別設置group_concat_max_len系統變量來擴展最大長度。
MySQL GROUP_CONCAT示例
讓我們來看看示例數據庫(yiibaidb)中的customers表,其表結構如下所示 -
mysql> desc customers; +------------------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------------------+---------------+------+-----+---------+-------+ | customerNumber | int(11) | NO | PRI | NULL | | | customerName | varchar(50) | NO | | NULL | | | contactLastName | varchar(50) | NO | | NULL | | | contactFirstName | varchar(50) | NO | | NULL | | | phone | varchar(50) | NO | | NULL | | | addressLine1 | varchar(50) | NO | | NULL | | | addressLine2 | varchar(50) | YES | | NULL | | | city | varchar(50) | NO | | NULL | | | state | varchar(50) | YES | | NULL | | | postalCode | varchar(15) | YES | | NULL | | | country | varchar(50) | NO | | NULL | | | salesRepEmployeeNumber | int(11) | YES | MUL | NULL | | | creditLimit | decimal(10,2) | YES | | NULL | | +------------------------+---------------+------+-----+---------+-------+ 13 rows in set要獲取客戶所在的國家/地區,以逗號分隔的字符串,您可以使用GROUP_CONCAT函數,如下所示:
SELECT GROUP_CONCAT(country) FROMcustomers;SQL
執行上面查詢語句,得到以下結果 -
?
然而,一些客戶位于同一個國家。要刪除重復的國家/地區名稱,請將DISTINCT子句添加到函數,如下查詢:
mysql> SELECT GROUP_CONCAT(DISTINCT country) FROMcustomers; +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | GROUP_CONCAT(DISTINCT country) | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | France,USA,Australia,Norway,Poland,Germany,Spain,Sweden,Denmark,Singapore,Portugal,Japan,Finland,UK,Ireland,Canada,Hong Kong,Italy,Switzerland,Netherlands,Belgium,New Zealand,South Africa,Austria,Philippines,Russia,Israel | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set如果國家的名稱按升序排列,則可讀性更高。要在連接之前排序國家的名稱,請使用ORDER BY子句如下:
SELECT GROUP_CONCAT(DISTINCT countryORDER BY country) FROMcustomers;執行上面查詢語句,得到以下結果 -
mysql> SELECT GROUP_CONCAT(DISTINCT countryORDER BY country) FROMcustomers; +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | GROUP_CONCAT(DISTINCT countryORDER BY country) | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Australia,Austria,Belgium,Canada,Denmark,Finland,France,Germany,Hong Kong,Ireland,Israel,Italy,Japan,Netherlands,New Zealand,Norway,Philippines,Poland,Portugal,Russia,Singapore,South Africa,Spain,Sweden,Switzerland,UK,USA | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set要將返回的字符串的默認分隔符從逗號(,)更改為分號(;),請使用SEPARATOR子句作為以下查詢:
SELECT GROUP_CONCAT(DISTINCT countryORDER BY countrySEPARATOR ';') FROMcustomers;執行上面查詢語句,得到以下結果?
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | GROUP_CONCAT(DISTINCT countryORDER BY countrySEPARATOR ';') | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Australia;Austria;Belgium;Canada;Denmark;Finland;France;Germany;Hong Kong;Ireland;Israel;Italy;Japan;Netherlands;New Zealand;Norway;Philippines;Poland;Portugal;Russia;Singapore;South Africa;Spain;Sweden;Switzerland;UK;USA | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set經過上面幾個簡單示例,現在您應該知道GROUP_CONCAT函數是如何工作,現在把它應用在一個實際的例子中。
每個客戶都有一個或多個銷售代表。 換句話說,每個銷售人員都負責一個或多個客戶。 要了解誰負責哪些客戶,使用inner join子句如下:
SELECT employeeNumber, firstname, lastname, customername FROMemployeesINNER JOINcustomers ON customers.salesRepEmployeeNumber = employees.employeeNumber ORDER BY firstname , lastname;執行上面查詢語句,得到以下結果 -
+----------------+-----------+-----------+------------------------------------+ | employeeNumber | firstname | lastname | customername | +----------------+-----------+-----------+------------------------------------+ | 1611 | Andy | Fixter | Souveniers And Things Co. | | 1611 | Andy | Fixter | Australian Collectables, Ltd | | 1611 | Andy | Fixter | Australian Gift Network, Co | | 1611 | Andy | Fixter | Australian Collectors, Co. | | 1611 | Andy | Fixter | Anna's Decorations, Ltd | | 1504 | Barry | Jones | Baane Mini Imports | | 1504 | Barry | Jones | Toms Spezialitten, Ltd | ************* 此處省略了一大波數據 ********************************************* | 1216 | Steve | Patterson | Auto-Moto Classics Inc. | | 1216 | Steve | Patterson | Gifts4AllAges.com | | 1216 | Steve | Patterson | FunGiftIdeas.com | | 1216 | Steve | Patterson | Diecast Classics Inc. | | 1216 | Steve | Patterson | Online Diecast Creations Co. | +----------------+-----------+-----------+------------------------------------+ 122 rows in set現在,我們可以按員工編號對結果集進行分組,并使用GROUP_CONCAT函數連接正在負責員工的所有員工,如下所示:
SELECT employeeNumber,firstName,lastName,GROUP_CONCAT(DISTINCT customernameORDER BY customerName) FROMemployeesINNER JOINcustomers ON customers.salesRepEmployeeNumber = employeeNumber GROUP BY employeeNumber ORDER BY firstName , lastname;上面查詢語句,執行結果如下 -
?
如下所示的結果更容易閱讀。
具有CONCAT_WS函數的MySQL GROUP_CONCAT函數的示例
有時,GROUP_CONCAT函數可以與CONCAT_WS函數相結合,使查詢結果更有用。
例如,制作客戶分號分隔值列表:
- 首先,使用CONCAT_WS函數連接每個客戶聯系人的姓氏和名字,結果是聯系人的全名。
- 然后,使用GROUP_CONCAT函數來創建列表。
以下查詢使客戶的分號分隔值列表。
SELECT GROUP_CONCAT(CONCAT_WS(', ', contactLastName, contactFirstName)SEPARATOR ';') FROMcustomers;請注意,GROUP_CONCAT函數將字符串值連接在不同的行中,而CONCAT_WS或CONCAT函數將不同列中的兩個或多個字符串值連接起來。
MySQL GROUP_CONCAT函數:常見錯誤
GROUP_CONCAT函數返回單個字符串,而不是值列表。 這意味著您不能在IN操作符中使用GROUP_CONCAT函數的結果,例如在子查詢中使用。
例如,GROUP_CONCAT函數返回值的結果:1,?2和3連接成為字符串:1,2,3?。
如果將此結果提供給IN運算符,則查詢不能正常工作。因此,查詢可能不返回任何結果。例如,以下查詢將無法正常工作。
因為IN運算符接受諸如(1,2,3)的值的列表,而不是由值列表('1,2,3')組成的字符串。 因此,以下查詢將無法正常工作。
SELECT id, name FROMtable_name WHEREid IN GROUP_CONCAT(id);因為GROUP_CONCAT函數是一個聚合函數,要對值進行排序,必須在函數內使用ORDER BY子句,而不是SELECT語句中的ORDER BY。
以下示例演示了在使用GROUP_CONCAT函數的上下文中ORDER BY子句的不正確使用:
SELECT GROUP_CONCAT(DISTINCT countrySEPARATOR ';') FROMcustomers ORDER BY country;SELECT子句返回一個字符串值,因此ORDER BY子句在此語句中不起作用。
?
MySQL GROUP_CONCAT應用程序
在許多情況下,您可以應用GROUP_CONCAT函數來產生有用的結果。 以下列表是使用GROUP_CONCAT函數的一些常見示例。
- 用逗號分隔的用戶角色,如“管理員,作者,編輯人員”。
- 生成逗號分隔的用戶的愛好,如“設計,編程,閱讀”。
- 為博客帖子,文章或產品創建標簽,例如“mysql,mysql聚合函數,mysql教程”。
在本教程中,我們介紹了MySQL?GROUP_CONCAT函數,將非空值從一組字符串連接到具有各種選項的字符串中。
參考
MySQL GROUP_CONCAT函數 :
http://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat
總結
以上是生活随笔為你收集整理的MySQL group_concat()函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL max()函数
- 下一篇: MySQL concat()函数