標籤:mysql group_concat
隨著業務的不斷增長,最近一段需要對大量的曆史資料整理,而在整理過程中有一張表的資料需要把其中一張表中一個不唯一的欄位的列作為唯一欄位在新表中而其中相關聯的欄位全部存入同一條記錄中,剛剛開始想了一會,到後來在得知GROUP_CONCAT函數就可以解決,作用是在使用彙總函式時使用該函數返回一個字串結果,並帶有非NULL值一組中的值, 如果沒有非NULL值,則返回NULL,自己用了下確實是不錯,在這裡就簡單的記錄說明一下,而GROUP_CONCAT函數使用也很簡單
GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]] [SEPARATOR str_val])
舉一個例子,如下:
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函數就可以很簡單的查詢出所需要的資料
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函數可以解決很多複製的問題,而在使用的過程中有幾個需要注意的地方:
1、在查出來的結果在其中必須使用GROUP BY做其中一個關聯欄位做去重使得其中一個欄位變成該列的唯一值做彙總
2、在使用GROUP_CONCAT函數時在MySQL中對其處理的結果最大長度(字元)限制,用了GROUP_CONCAT函數,SELECT語句中的LIMIT語句起不了任何作用,預設的字串長度限制是1024(個字元),如果處理的欄位超過1024個字元時需要修改系統變數
mysql> SHOW GLOBAL VARIABLES LIKE ‘group_concat_max_len‘;+----------------------+-------+| Variable_name | Value |+----------------------+-------+| group_concat_max_len | 1024 |+----------------------+-------+1 row in set (0.01 sec)
3、串連的欄位為INT類型時,低版本或出現返回的結果不是逗號分隔的字串,而是byte[]。此時,需要用CAST或CONVERT函數進行轉換。
本文出自 “Jim的技術隨筆” 部落格,謝絕轉載!
MySQL的GROUP_CONCAT函數