Skip to content

GROUP_CONCAT

GROUP_CONCAT 函数返回一个字符串,它将通过列或者表达式指定的内容连接起来。

函数说明

GROUP_CONCAT 函数返回一个字符串,它将通过列或者表达式指定的内容连接起来。

如果结果集没有任何行,此函数将返回 NULL

函数语法

> GROUP_CONCAT(expr)

完整的语法如下:

GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val])

参数释义

参数 说明
expr 必须参数。它指定了要连接的一个或者多个列或表达式。
DISTINCT 可选参数。它用于消除重复值。
ORDER BY 可选参数。它用于对要连接的内容排序。默认情况下,它按升序排序值。如果要按降序对值进行排序,则需要明确指定 DESC 选项。
SEPARATOR 可选参数。连接符。默认是 ,

返回值

返回值是一个非二进制或二进制字符串,这取决于参数 expr 是非二进制还是二进制字符串。

如果结果集没有任何行,此函数将返回 NULL

示例

create table t1(a int,b text,c text);
insert into t1 values(1,"a","bc"),(2,"ab","c"),(3,"aa","bb"),(3,"aa","bb");

mysql> select group_concat(distinct a,b,c separator '|') from t1;
+-----------------------------------+
| group_concat(distinct a, b, c, |) |
+-----------------------------------+
| 1abc|2abc|3aabb                   |
+-----------------------------------+
1 row in set (0.01 sec)

mysql> select group_concat(distinct b,c separator '|') from t1 group by a;
+--------------------------------+
| group_concat(distinct b, c, |) |
+--------------------------------+
| abc                            |
| abc                            |
| aabb                           |
+--------------------------------+
3 rows in set (0.01 sec)

mysql> select group_concat(distinct b,c separator '|') from t1;
+--------------------------------+
| group_concat(distinct b, c, |) |
+--------------------------------+
| abc|abc|aabb                   |
+--------------------------------+
1 row in set (0.01 sec)

多参数 GROUP_CONCAT 搭配 ORDER BY

DROP DATABASE IF EXISTS group_concat_demo;
CREATE DATABASE group_concat_demo;
USE group_concat_demo;

CREATE TABLE t1 (g INT, k INT, a VARCHAR(10), b VARCHAR(10));
INSERT INTO t1 VALUES (1, 2, 'a2', 'b2'), (1, 1, 'a1', 'b1');

-- 多参数 GROUP_CONCAT 搭配 ORDER BY 按指定列排序。
SELECT g, GROUP_CONCAT(a, ':', b ORDER BY k) AS gc FROM t1 GROUP BY g;

DROP DATABASE group_concat_demo;

多个 GROUP_CONCAT 各自独立排序

DROP DATABASE IF EXISTS group_concat_multi_demo;
CREATE DATABASE group_concat_multi_demo;
USE group_concat_multi_demo;

CREATE TABLE t1 (g INT, a VARCHAR(10), b VARCHAR(10), x INT, y INT);
INSERT INTO t1 VALUES (1, 'a1', 'b1', 1, 2), (1, 'a2', 'b2', 2, 1);

-- 每个 GROUP_CONCAT 调用独立使用自己的 ORDER BY 子句。
SELECT
  g,
  GROUP_CONCAT(a ORDER BY x) AS by_x,
  GROUP_CONCAT(b ORDER BY y) AS by_y
FROM t1
GROUP BY g;

DROP DATABASE group_concat_multi_demo;