如何查找/删除同一行中的重复记录

时间:2011-01-23 09:49:39

标签: mysql duplicates row field

可以进行查询以查看同一行中是否有重复的记录?

我试图找到一个解决方案,但我能找到的只是检测列中的重复字段,而不是行。

例如,假设我有一个包含行和项目的表:

| id | item1 | item2 | item3 | item4 | item5 | upvotes | downvotes |
--------------------------------------------------------------------
| 1  |  red  | blue  |  red  | black | white |   12    |    5      |

所以我想看看是否可以进行查询以检测具有相同记录的字段(在本例中为红色)并删除它们,和/或如何重新设计我的结构以不允许重复。

感谢。

1 个答案:

答案 0 :(得分:4)

重新设计:

您可以将布局重新设计为以下内容:

| id | item |

使用(id,item)作为主键,这将禁止给定item两倍id

所以数据看起来像这样:

| id | item |
| 1  | red  |
| 1  | blue |
...

尝试再次插入| 1 | red |会引发错误。

没有重新设计:

如果您不想更改布局,此查询将查找其中一个fieldX字段等于同一行的另一个fieldX的行:

SELECT t.id FROM (select 1) dummy
JOIN (SELECT id, item1 as item FROM table
      UNION SELECT id, item2 as item FROM table
      UNION SELECT id, item3 as item FROM table
      UNION SELECT id, item4 as item FROM table
      UNION SELECT id, item5 as item FROM table) t
GROUP BY t.id
HAVING count(*) < 5

(假设您有5个fieldX列。)

这实际上会计算每个fieldX的不同id值。如果计数与字段数不同,则存在重复。该查询返回存在重复行的行的ID。

测试后,您可以使用

删除行
DELETE FROM table WHERE id IN ( <the previous query here> )