我有一个表有一些重复值的字段。因为我不知道哪些是正确的,所以我不能删除那些重复项,所以我想识别所有可能重复相同值的记录,并在列中设置可能重复的id。 这是一个示例测试表:
id col1 col2
----------------
1 aaa aaa
2 baa bbb
3 abc ccc
4 cde aaa
5 baa bbb
6 aaa aaa
并希望在col2中找到以下结果:
id col1 col2 dup
----------------
1 aaa aaa 4,6
2 baa bbb 5
3 abc ccc
4 cde aaa 6,1
5 baa bbb 2
6 aaa aaa 1,4
因此,对于多个副本,它必须报告以逗号分隔的重复列表。 我有一个sql语句来识别那些重复但不知道如何设置更新查询:
select distinct l.* from table l
inner join table r on l.id != r.id and l.col2 = r.col2
有什么想法吗?
答案 0 :(得分:1)
这似乎有效:
mysql> select id, col1, col2, (select group_concat(id) from bubu q where q.col2=a.col2 and q.id <> a.id group by q.col2) as dup from bubu a;
+----+------+------+------+
| id | col1 | col2 | dup |
+----+------+------+------+
| 1 | aaa | aaa | 4,6 |
| 2 | baa | bbb | 5 |
| 3 | abc | ccc | NULL |
| 4 | cde | aaa | 1,6 |
| 5 | baa | bbb | 2 |
| 6 | aaa | aaa | 1,4 |
+----+------+------+------+
要更新原始表,看起来您需要先创建一个临时表:
create table tmp as select id, (select group_concat(id) from bubu q where q.col2=a.col2
and q.id <> a.id group by q.col2) as dup from bubu a;
update bubu a set dup = (select dup from tmp where tmp.id=a.id);
如果您的表很大,那么在更新之前在tmp.id
上创建索引可能会有所帮助(但尚未经过测试)。