随着业务的不断增加,最近一段须要对大量的历史数据整理,而在整理过程当中有一张表的数据须要把其中一张表中一个不惟一的字段的列做为惟一字段在新表中而其中相关联的字段所有存入同一条记录中,刚刚开始想了一会,到后来在得知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函数进行转换。
登录