隨着業務的不斷增加,最近一段須要對大量的歷史數據整理,而在整理過程當中有一張表的數據須要把其中一張表中一個不惟一的字段的列做爲惟一字段在新表中而其中相關聯的字段所有存入同一條記錄中,剛剛開始想了一會,到後來在得知GROUP_CONCAT函數就能夠解決,做用是在使用聚合函數時使用該函數返回一個字符串結果,並帶有非NULL值一組中的值, 若是沒有非NULL值,則返回NULL,本身用了下確實是不錯,在這裏就簡單的記錄說明一下,而GROUP_CONCAT函數使用也很簡單
mysql
GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]] [SEPARATOR str_val])
舉一個例子,以下:
sql
DROP TABLE IF EXISTS `employee_tbl`; CREATE TABLE `employee_tbl` ( `id` int(11) NOT NULL, `name` char(10) NOT NULL DEFAULT '', `date` datetime NOT NULL, `singin` tinyint(4) NOT NULL DEFAULT '0' COMMENT '登陸次數', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `employee_tbl` VALUES ('1', '小明', '2016-04-22 15:25:33', '1'); INSERT INTO `employee_tbl` VALUES ('2', '小王', '2016-04-20 15:25:47', '3'); INSERT INTO `employee_tbl` VALUES ('3', '小麗', '2016-04-19 15:26:02', '2'); INSERT INTO `employee_tbl` VALUES ('4', '小王', '2016-04-07 15:26:14', '4'); INSERT INTO `employee_tbl` VALUES ('5', '小明', '2016-04-11 15:26:40', '4'); INSERT INTO `employee_tbl` VALUES ('6', '小明', '2016-04-04 15:26:54', '2');
在這張表中須要在新表中記錄name、date這2個字段的內容,其中須要name字段惟一,date多條記錄用逗號隔開存入同一字段,在使用GROUP_CONCAT函數就能夠很簡單的查詢出所須要的數據ide
mysql> SELECT `name`, GROUP_CONCAT(date) 'date' FROM employee_tbl GROUP BY `name`; +--------+-------------------------------------------------------------+ | name | date | +--------+-------------------------------------------------------------+ | 小麗 | 2016-04-19 15:26:02 | | 小明 | 2016-04-22 15:25:33,2016-04-11 15:26:40,2016-04-04 15:26:54 | | 小王 | 2016-04-20 15:25:47,2016-04-07 15:26:14 | +--------+-------------------------------------------------------------+ 3 rows in set (0.01 sec)
如此就把數據投影出來了,其中默認的分隔符是逗號,若是須要能夠指定其餘分隔符,如';'
函數
mysql> SELECT `name`, GROUP_CONCAT(date SEPARATOR ';') 'date' FROM employee_tbl GROUP BY `name`; +--------+-------------------------------------------------------------+ | name | date | +--------+-------------------------------------------------------------+ | 小麗 | 2016-04-19 15:26:02 | | 小明 | 2016-04-22 15:25:33;2016-04-11 15:26:40;2016-04-04 15:26:54 | | 小王 | 2016-04-20 15:25:47;2016-04-07 15:26:14 | +--------+-------------------------------------------------------------+ 3 rows in set (0.01 sec)
總之在使用GROUP_CONCAT函數能夠解決不少複製的問題,而在使用的過程當中有幾個須要注意的地方:
字符串
一、在查出來的結果在其中必須使用GROUP BY作其中一個關聯字段作去重使得其中一個字段變成該列的惟一值作聚合it
二、在使用GROUP_CONCAT函數時在MySQL中對其處理的結果最大長度(字符)限制,用了GROUP_CONCAT函數,SELECT語句中的LIMIT語句起不了任何做用,缺省的字符串長度限制是1024(個字符),若是處理的字段超過1024個字符時須要修改系統變量class
mysql> SHOW GLOBAL VARIABLES LIKE 'group_concat_max_len'; +----------------------+-------+ | Variable_name | Value | +----------------------+-------+ | group_concat_max_len | 1024 | +----------------------+-------+ 1 row in set (0.01 sec)
三、鏈接的字段爲INT類型時,低版本或出現返回的結果不是逗號分隔的字符串,而是byte[]。此時,須要用CAST或CONVERT函數進行轉換。
登錄