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

举例1

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

id colors
1 1
2 2
3 3
4 4,5
5 1,2,3
6 2,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函数将两个拼接后的字符串用分号连接起来。

扫描二维码关注公众号,回复: 14785355 查看本文章

查询结果将会是:

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

猜你喜欢

转载自blog.csdn.net/A_yonga/article/details/129315443