什么是 GROUP_CONCAT?
GROUP_CONCAT是MySQL中的一种聚合函数,用于将多行的结果集合并成一个单一的字符串,并通过指定的分隔符连接这些值。这个函数通常与GROUP BY一起使用,可以有效地将相关行的信息压缩到单个结果行中。
基本语法
GROUP_CONCAT([DISTINCT] expr [,expr ...][ORDER BY {unsigned_integer | col_name | expr} [ASC|DESC][,col_name ...]][SEPARATOR str_val])
expr: 要连接的列名或表达式。DISTINCT: 可选参数,用于去除重复值。ORDER BY: 可选参数,用于对值进行排序。SEPARATOR: 指定连接符,默认为逗号,。
使用示例
假设我们有一个名为 students 的表,结构如下:

基本用法
如果我们想获取每个班级的所有学生的名字,可以这样写:
SELECT class, GROUP_CONCAT(name) AS students FROM students GROUP BY class;
输出结果:

去重并排序
如果我们想要去除重复的学生名字,并按字母降序排列,可以这样做:
SELECT class, GROUP_CONCAT(DISTINCT name ORDER BY name DESC) AS students FROM students GROUP BY class;
输出结果:

高级应用
电商场景示例
在一个电商数据库中,有一个订单表和一个订单详情表。查询每个订单的商品名称列表:
SELECT o.order_id, GROUP_CONCAT(od.product_name SEPARATOR ', ') AS products FROM orders o JOIN order_details od ON o.order_id = od.order_id GROUP BY o.order_id;
这将返回每个订单 ID 及其对应的所有商品名称的列表。
Orders 表 (订单表)


Order_Details 表 (订单详情表)


获取每个订单的商品名称列表,可以使用如下 SQL 查询:
SELECT o.order_id, o.customer_name, o.order_date, GROUP_CONCAT(od.product_name SEPARATOR ', ') AS products FROM orders o JOIN order_details od ON o.order_id = od.order_id GROUP BY o.order_id, o.customer_name, o.order_date;
查询结果:

注意事项
- 长度限制:
GROUP_CONCAT的最大长度受限于系统变量group_concat_max_len(默认是 1024 字节)。如果需要,可以通过设置这个变量来调整最大长度:
SET SESSION group_concat_max_len = 1000000;
结论
GROUP_CONCAT是MySQL中一个非常实用的函数,它可以帮助开发者更高效地处理和展示数据。无论是在简单的统计分析还是复杂的数据聚合场景中,GROUP_CONCAT都能提供强大的支持。掌握它的用法和技巧,可以让 SQL 查询更加简洁和功能强大。


