Skip to content

GROUP_CONCAT函数


在进行数据统计和查询时,常常需要对 多个记录的某些字段值 进行合并,尤其是当数据按照某种条件进行分组时。MySQL 提供了一个非常实用的聚合函数——GROUP_CONCAT,它可以将 分组后的多行数据 合并成一个字符串,极大地方便了数据的展示和处理。

GROUP_CONCAT 是 MySQL 中的一个聚合函数,它能够 将同一组内的多个值合并成一个字符串。通常,它用于 分组查询 中,将多行数据的某一列值连接成一个单一的字符串,便于进一步处理或展示。

基本语法:

GROUP_CONCAT([DISTINCT] expression [ORDER BY ...] [SEPARATOR 'separator'])
  • DISTINCT:去除重复值。

  • expression:要合并的列或表达式。

  • ORDER BY:指定合并顺序。

  • SEPARATOR:指定连接各个值的分隔符,默认是逗号(,)。

GROUP_CONCAT 最常见的应用场景是将多个值按特定分隔符连接成一个字符串。让我们通过一个实际的例子来了解它的使用方法。

假设我们有一个学生表 students,其中有 class_idname 字段。现在,我们想要统计每个班级的学生名字,并将名字连接成一个字符串,可以使用 GROUP_CONCAT

SELECT class_id, GROUP_CONCAT(name) AS student_names
FROM students
GROUP BY class_id;

解析:

  • GROUP_CONCAT(name):将同一 class_id 下的所有 name 合并成一个字符串,默认使用逗号分隔。

  • GROUP BY class_id:根据 class_id 进行分组。

结果:

假设 students 表中的数据如下:

class_idname
1Alice
1Bob
2Charlie
2David
2Eve

执行上述查询后,返回结果将是:

class_idstudent_names
1Alice,Bob
2Charlie,David,Eve

这样,GROUP_CONCAT 函数帮助我们将每个班级的学生名字连接成一个字符串。

GROUP_CONCAT 允许我们定制 分隔符排序顺序。默认情况下,GROUP_CONCAT 使用逗号(,)作为分隔符,但我们可以自定义它;同时,我们还可以指定合并时的排序顺序。

使用 SEPARATOR 关键字,可以指定分隔符。例如,我们可以将学生名字用分号(;)分隔:

SELECT class_id, GROUP_CONCAT(name SEPARATOR '; ') AS student_names
FROM students
GROUP BY class_id;

使用 ORDER BY 可以指定连接的顺序。例如,我们希望学生名字按字母顺序排列:

SELECT class_id, GROUP_CONCAT(name ORDER BY name) AS student_names
FROM students
GROUP BY class_id;

结果:

class_idstudent_names
1Alice,Bob
2Charlie,David,Eve

如果你希望在连接多个值时去除重复项,可以使用 DISTINCT 关键字。例如,如果我们希望每个班级的学生名字不重复:

SELECT class_id, GROUP_CONCAT(DISTINCT name) AS student_names
FROM students
GROUP BY class_id;

GROUP_CONCAT 可以与其他聚合函数一起使用。在复杂的查询中,你可以在同一查询中同时使用 GROUP_CONCATSUMAVG 等函数来统计数据。

SELECT class_id,
GROUP_CONCAT(name) AS student_names,
SUM(score) AS total_score
FROM students
GROUP BY class_id;
  • 结果长度限制GROUP_CONCAT 有一个默认的最大长度限制(1024 字节),如果返回的字符串超出了限制,可以通过设置 group_concat_max_len 参数来增加限制。

    SET SESSION group_concat_max_len = 10000;
  • 性能GROUP_CONCAT 适用于数据量较小到中等的场景。如果数据量非常大,可能会影响查询性能。