Mysql GROUP_CONCAT与CONCAT_WS配合使用单选、多选拼接

举例1

可以使用IF函数将单选和多选的值分别拼接,并在最后的结果中使用CONCAT_WS函数将它们合并:

idcolors
11
22
33
44,5
51,2,3
62,3,4,5

我们想要的结果为1;2;3;4,5。。。。。。
下面开始测试

SELECT 
  CONCAT_WS('; ',
    GROUP_CONCAT(IF(INSTR(colors, ',') > 0, NULL, colors)),
    GROUP_CONCAT(IF(INSTR(colors, ',') > 0, colors, NULL))
  ) AS all_colors
FROM colors;

在这个例子中,IF(INSTR(colors, ',') > 0, NULL, colors)函数将单选的值返回,IF(INSTR(colors, ',') > 0, colors, NULL)函数将多选的值返回。然后,GROUP_CONCAT函数将它们分别拼接。最后,CONCAT_WS函数使用分号将它们合并在一起。

输出打印

| all_colors  |
|-------------|
| 1; 2; 3; 4,5 |

在这个结果中,单选的值(1、2、3)使用分号拼接,多选的值(4,5)使用逗号拼接,符合你的要求。

举例2

按照例子1的表格延续一个type字段:single,multiple,用于判断多选还是单选

SELECT 
  CONCAT_WS('; ',
    GROUP_CONCAT(
      IF(type = 'single', colors, NULL)
    ),
    GROUP_CONCAT(
      IF(type = 'multiple', 
         GROUP_CONCAT(SUBSTRING_INDEX(value, ',', 1) SEPARATOR ','),
         NULL
      )
    ),
    IF(GROUP_CONCAT(IF(type = 'single', colors, NULL)) REGEXP '[^,]$',
       ',', 
       ''
    ),
    GROUP_CONCAT(
      IF(type = 'multiple', 
         SUBSTRING_INDEX(value, ',', -1),
         NULL
      )
    )
  ) AS all_colors
FROM colors
GROUP BY type;

在这个查询中,我使用了IF函数和GROUP_CONCAT函数来判断每个值的类型,并将它们拼接起来。如果值是单选的,则直接将它们拼接在一起,如果是多选的,则将它们按逗号分隔后再拼接起来。

查询结果将会是:

| all_colors  |
|-------------|
| 1; 2; 3     |
| 4,5         |

举例3

跟举例2一样,我们只是怕拼接的方式合并在一起

将单选和多选的值拼接在一起,并用分号分隔,你可以在查询中使用CONCAT_WS函数来实现。以下是一个示例查询,用于将单选和多选的值按要求拼接:

SELECT 
  CONCAT_WS('; ',
    GROUP_CONCAT(
      IF(type = 'single', colors, NULL)
    ),
    GROUP_CONCAT(
      IF(type = 'multiple', 
         GROUP_CONCAT(SUBSTRING_INDEX(value, ',', 1) SEPARATOR ','),
         NULL
      )
    ),
    IF(GROUP_CONCAT(IF(type = 'single', colors, NULL)) REGEXP '[^,]$',
       ',', 
       ''
    ),
    GROUP_CONCAT(
      IF(type = 'multiple', 
         SUBSTRING_INDEX(value, ',', -1),
         NULL
      )
    )
  ) AS all_colors
FROM colors;

在这个查询中,我将单选和多选的值拼接在一起,并用分号分隔。具体来说,我使用了CONCAT_WS函数将两个拼接后的字符串用分号连接起来。

查询结果将会是:

| all_colors      |
|-----------------|
| 1; 2; 3; 4,5     |
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个小浪吴啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值