在sql表中为重复项设置一个标志

时间:2017-11-14 13:09:14

标签: mysql

我有一个表有一些重复值的字段。因为我不知道哪些是正确的,所以我不能删除那些重复项,所以我想识别所有可能重复相同值的记录,并在列中设置可能重复的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

有什么想法吗?

1 个答案:

答案 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上创建索引可能会有所帮助(但尚未经过测试)。