1. 程式人生 > >MySQL的GROUP_CONCAT函數

MySQL的GROUP_CONCAT函數

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函數