mysql多行合并

本文介绍了一种使用SQL进行数据处理的方法,通过GROUP BY和GROUP_CONCAT函数实现将一列数据按照指定规则进行分组和字符串拼接,适用于需要整理和展示复杂数据结构的场景。
原表的数据是这样的
ID RE_ID
1 2001
2 2001
2 2003
1 2002
3 2003
2 2002
3 2004
......
希望得到的数据是:
ID RE_ID
1 2001,2002
2 2001,2002,2003
3 2003,2004



select id,group_concat(re_id order by re_id separator ", ") as re_id
from tablename
group by id
### 一、MySQL GROUP_CONCAT 函数概述 `GROUP_CONCAT` 是 MySQL 提供的一个聚合函数,用于将分组后的多行数据合并成一个字符串[^1]。其基本语法如下: ```sql GROUP_CONCAT([DISTINCT] 要连接的字段 [Order BY 排序字段 ASC/DESC] [Separator '分隔符']) ``` - `DISTINCT`:可选参数,用于去除重复值。 - `Order BY`:可选参数,用于指定结果的排序方式。 - `Separator`:可选参数,默认使用逗号 `,` 作为分隔符,可以自定义分隔符。 ### 二、基础示例 以下是一个简单的例子,展示如何使用 `GROUP_CONCAT` 将多行数据合并为单个字符串: ```sql SELECT category, GROUP_CONCAT(product_name SEPARATOR ', ') AS products FROM products GROUP BY category; ``` 上述查询会按照 `category` 字段进行分组,并将每个分组中的 `product_name` 字段值用逗号和空格连接起来[^1]。 ### 三、去除为空的字段 如果某些字段值可能为空(NULL),可以通过 `IFNULL` 或者 `COALESCE` 函数将其替换为其他值,避免在最终结果中出现空白项。例如: ```sql SELECT category, GROUP_CONCAT(IFNULL(product_name, '未知') SEPARATOR ', ') AS products FROM products GROUP BY category; ``` 上述代码中,若 `product_name` 为 NULL,则会被替换为字符串 `'未知'`[^1]。 ### 四、自定义分隔符 默认情况下,`GROUP_CONCAT` 使用逗号 `,` 作为分隔符。如果需要更改分隔符,可以在语句中指定 `SEPARATOR` 参数。例如,使用换行符 `\n` 作为分隔符: ```sql SELECT category, GROUP_CONCAT(product_name SEPARATOR '\n') AS products FROM products GROUP BY category; ``` ### 五、设置最大长度限制 `GROUP_CONCAT` 的结果默认有一个最大长度限制(通常为 1024 字节)。如果需要处理更长的结果,可以通过设置系统变量 `group_concat_max_len` 来调整限制。例如: ```sql SET SESSION group_concat_max_len = 10000; ``` 该命令将当前会话的最大长度限制设置为 10000 字节。 ### 六、结合其他函数使用 除了 `GROUP_CONCAT`,还可以结合 `SUBSTRING_INDEX` 实现字符串拆分功能。例如,将已合并的字符串重新拆分为多行记录[^2]: ```sql SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('a,b,c,d', ',', numbers.n), ',', -1) AS item FROM (SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4) numbers; ``` 上述代码展示了如何通过生成的数字序列将逗号分隔的字符串拆分为多行记录。 ### 七、注意事项 - 如果分组后的结果超出 `group_concat_max_len` 的限制,多余部分会被截断。 - 默认分隔符为逗号 `,`,如果需要无分隔符的结果,可以使用 `SEPARATOR ''`[^1]。 ```sql SELECT category, GROUP_CONCAT(product_name SEPARATOR '') AS products FROM products GROUP BY category; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值