使用场景介绍

按照部门编号dept_no进行汇总,属于同一个部门的员工编号emp_no通过逗号进行连接,结果给出dept_no以及连接出的结果employees

1
2
3
4
5
6
CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL,
`dept_no` char(4) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`));

输出格式:

1
2
3
4
5
6
7
8
9
10
+---------+-------------------+
| dept_no | employees |
+---------+-------------------+
| d001 | 10001,10002 |
| d002 | 10006 |
| d003 | 10005 |
| d004 | 10003,10004 |
| d005 | 10007,10008,10010 |
| d006 | 10009,10010 |
+---------+-------------------+

解决方法

聚合函数group_concat(X,Y),其中X是要连接的字段,Y是连接时用的符号,可省略,默认为逗号。此函数必须与 GROUP BY 配合使用。

1
2
3
4
SELECT dept_no, group_concat(emp_no) AS employees
FROM dept_emp
GROUP BY dept_no;

如果不是用默认的逗号连接,而是其他符号,比如’&’,那么可以修改为:

1
2
3
SELECT dept_no, group_concat(emp_no separator '&') AS employees
FROM dept_emp
GROUP BY dept_no;

输出结果

1
2
3
4
5
6
7
8
9
10
+---------+-------------------+
| dept_no | employees |
+---------+-------------------+
| d001 | 10001&10002 |
| d002 | 10006 |
| d003 | 10005 |
| d004 | 10003&10004 |
| d005 | 10007&10008&10010 |
| d006 | 10009&10010 |
+---------+-------------------+