签到成功

知道了

CNDBA社区CNDBA社区

MySQL group_concat 函数 说明

2025-01-07 11:00 395 0 转载 MySQL
作者: dave

本文由大模型生成

GROUP_CONCAT 是 MySQL 中的一个非常有用的聚合函数,它允许你将来自同一个分组的多行数据连接成一个单独的字符串。这在生成报告或需要将分组数据以特定格式展示时非常有帮助。

基本用法

当你对一个表执行分组查询(如使用 GROUP BY 子句)时,GROUP_CONCAT 可以将每个分组内的指定列值连接成一个字符串。默认情况下,这些值之间用逗号分隔。

http://www.cndba.cn/dave/article/131613
http://www.cndba.cn/dave/article/131613

语法

GROUP_CONCAT([DISTINCT] expression
             [ORDER BY {col_name | expr} [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val])
  • DISTINCT:可选,用于去除重复值。
  • expression:要连接的列或表达式。
  • ORDER BY:可选,指定连接前值的排序方式。
  • SEPARATOR:可选,指定分隔符,默认为逗号(,)。

示例

假设有一个名为 employees 的表,结构如下:http://www.cndba.cn/dave/article/131613

CREATE TABLE employees (
    id INT AUTO_INCREMENT PRIMARY KEY,
    department VARCHAR(50),
    name VARCHAR(50)
);

INSERT INTO employees (department, name) VALUES
('HR', 'Alice'),
('HR', 'Bob'),
('Engineering', 'Charlie'),
('Engineering', 'David'),
('Engineering', 'Eve');

你想获取每个部门所有员工的名字列表,可以这样查询:http://www.cndba.cn/dave/article/131613

SELECT department, GROUP_CONCAT(name) AS employee_names
FROM employees
GROUP BY department;

结果将是:

+--------------+----------------+
| department   | employee_names |
+--------------+----------------+
| Engineering  | Charlie,David,Eve |
| HR           | Alice,Bob      |
+--------------+----------------+

长度限制

GROUP_CONCAT 函数的结果有一个默认的最大长度限制,这个限制是由 MySQL 服务器变量 group_concat_max_len 控制的。默认长度通常是 1024 个字符。如果你的连接结果超过了这个长度,它将被截断。http://www.cndba.cn/dave/article/131613

http://www.cndba.cn/dave/article/131613

查看当前限制

SHOW VARIABLES LIKE 'group_concat_max_len';

修改限制

你可以通过 SET 命令来临时改变这个限制,或者在 MySQL 配置文件中永久设置它。

http://www.cndba.cn/dave/article/131613
http://www.cndba.cn/dave/article/131613

-- 临时修改,只对当前会话有效
SET SESSION group_concat_max_len = 10000;

-- 全局修改,对所有新会话有效,直到 MySQL 重启
SET GLOBAL group_concat_max_len = 10000;

修改示例

假设你想要一个更长的结果字符串,并且希望结果中的名字是按字母顺序排列的,你可以这样做:http://www.cndba.cn/dave/article/131613

SET SESSION group_concat_max_len = 10000; -- 临时增加长度限制

SELECT department, GROUP_CONCAT(name ORDER BY name ASC SEPARATOR ', ') AS employee_names
FROM employees
GROUP BY department;

结果将是:http://www.cndba.cn/dave/article/131613

+--------------+-----------------+
| department   | employee_names  |
+--------------+-----------------+
| Engineering  | Charlie, David, Eve |
| HR           | Alice, Bob      |
+--------------+-----------------+

在这个例子中,我们还改变了分隔符为逗号和空格(,),以使结果更易读。

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
dave

dave

关注

人的一生应该是这样度过的:当他回首往事的时候,他不会因为虚度年华而悔恨,也不会因为碌碌无为而羞耻;这样,在临死的时候,他就能够说:“我的整个生命和全部精力,都已经献给世界上最壮丽的事业....."

  • 2261
    原创
  • 3
    翻译
  • 578
    转载
  • 191
    评论
  • 访问:7964639次
  • 积分:4346
  • 等级:核心会员
  • 排名:第1名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ