MySQL: group_concat allows you to easily concatenate the grouped values of a row
Last week I stumbled over a really useful function in MySQL: group_concat allows you to concatenate the data of one column of multiple entries by grouping them by one field field. You can choose the separator to use for the concatenation. The full syntax is as follows:
GROUP_CONCAT([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[SEPARATOR str_val])
According to the MySQL documentation, the function returns a string result with the concatenated non-NULL
values from a group. It returns NULL
if there are no non-NULL
values. To eliminate duplicate values, use the DISTINCT
clause. To sort values in the result, use the ORDER BY
clause. To sort in reverse order, add the DESC
(descending) keyword to the name of the column you are sorting by in the ORDER BY
clause.
To make things clear, lets use a simple example to demonstrate the function:
So for example you have the following table representing the currently logged in users on a server:
CREATE TABLE `logged_in` (
`server` varchar(255) DEFAULT NULL,
`user` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
With the following entries:
There is one row for each user which is logged in on a specific server (e.g. marc is logged in on Server A). If you want the resultset to have a single entry for every server with a concatenated list of all the users logged in on that particular server, you can use group_concat
and group
the results by
the name of the server using the following query:
SELECT server,
group_concat(user SEPARATOR ',') AS logged_in_users
FROM logged_in
GROUP BY server;
Which leads to the desired result:
I hope this little demo was helpful to you. If you have any questions or comments, feel free to use the comment function below.
Links:
http://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat