随着业务的不断增长,最近一段需要对大量的历史数据整理,而在整理过程中有一张表的数据需要把其中一张表中一个不唯一的字段的列作为唯一字段在新表中而其中相关联的字段全部存入同一条记录中,刚刚开始想了一会,到后来在得知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函数进行转换。
来源: http://www.linuxidc.com/Linux/2017-10/147791.htm