MySQL 如何在MySQL中将重复值组合成一个,对应值以连字符分隔?
阅读更多:MySQL 教程
问题描述
在MySQL中,我们有时会遇到需要将重复的值合并起来的情况。比如说,我们需要合并某张表中的某一列的重复值,并以连字符(-)分隔。例如,有以下表:
CREATE TABLE mytable (
id INT,
name VARCHAR(20)
);
INSERT INTO mytable VALUES
(1, '张三'),
(2, '李四'),
(3, '王五'),
(4, '张三'),
(5, '李四');
我们需要将重复的姓名进行合并,且以连字符分隔,最终的结果应该为:
id name
1 张三
2 李四
3 王五
4 张三-张三
5 李四-李四
那么,该如何实现这一需求呢?
解决方法
我们需要使用MySQL提供的一些函数,例如GROUP_CONCAT()
和DISTINCT
等。
方法一:使用GROUP_CONCAT()
函数
GROUP_CONCAT()
函数用于将分组结果进行串联。我们可以将表按照姓名进行分组,然后使用GROUP_CONCAT()
函数将同一组中的姓名进行串联。
下面是实现代码:
SELECT GROUP_CONCAT(name SEPARATOR '-')
FROM mytable
GROUP BY name;
结果如下:
GROUP_CONCAT(name SEPARATOR '-')
张三
李四
王五
张三-张三
李四-李四
但是,这样的结果并不是我们需要的,因为它只返回了姓名,没有返回对应的id
。如果要保留id
,我们可以通过子查询的方式实现:
SELECT id, (
SELECT GROUP_CONCAT(name SEPARATOR '-')
FROM mytable
WHERE name = t.name
) name
FROM (
SELECT DISTINCT name
FROM mytable
) t INNER JOIN mytable ON t.name = mytable.name
ORDER BY id;
结果如下:
id name
1 张三
2 李四
3 王五
4 张三-张三
5 李四-李四
方法二:使用内置函数GROUP_CONCAT()
和DISTINCT
函数
我们也可以在GROUP_CONCAT()
函数中使用DISTINCT
来去重,这样就可以得到我们需要的结果。
SELECT id, GROUP_CONCAT(DISTINCT name SEPARATOR '-')
FROM mytable
GROUP BY id;
结果如下:
id name
1 张三
2 李四
3 王五
4 张三-张三
5 李四-李四
结论
通过以上两种方法,我们可以在MySQL中将重复值组合成一个,对应值以连字符分隔。在实际开发中,我们可以根据具体情况选择使用哪种方法。