删除具有两个重复字段但不是重复ID的MySQL行

时间:2012-08-08 19:09:32

标签: mysql sql duplicates

抱歉,我发现我的头衔令人困惑。请让我解释一下。

我有一个如下所示的数据库:

| i | a | b |
| 1 | 5 | 8 |
| 2 | 3 | 3 |
| 3 | 3 | 6 |
| 4 | 5 | 8 |
| 5 | 1 | 1 |
| 6 | 3 | 3 |

其中i是ID,ab是另外两个字段。如上所示,ID 2和ID 6都有a = 3b = 3。 ID 1和ID 4也是如此,a为5,b为8。即使ID号不同,我仍然认为这些行是重复的,并且除了一个之外的所有行都要删除。无论哪一个都没关系,并且不需要改变ID号以弥补差距(但我并不反对)。

我很高兴看到一个查询,将上面的例子改为:

| i | a | b |          | i | a | b |
| 3 | 3 | 6 |          | 1 | 5 | 8 |
| 4 | 5 | 8 |    or    | 2 | 3 | 3 |
| 5 | 1 | 1 |          | 3 | 3 | 6 |
| 6 | 3 | 3 |          | 5 | 1 | 1 |

请不要犹豫,要求提供更多细节,并提前致谢!

3 个答案:

答案 0 :(得分:3)

delete from your_table
where i not in 
(
    select * from 
    (
      select min(i)
      from your_table
      group by a, b 
    ) x
)

MySQL无法从正在选择的表中删除。这就是我使用select * from () x

创建选择子查询的原因

答案 1 :(得分:2)

首先。清理完表后,在a和b列上放置一个Alternate Key索引,以确保没有更多的重复记录添加到表中...但是,如果说,删除最后输入的重复项,则需要< / p>

 Delete TableName
 From Tablename t
 Where id <> (Select Min(id) From TableName
             Where a = t.a and b = t.b)

要删除除最后输入的所有输入之外的所有输入,请将最小值更改为最大值

答案 2 :(得分:1)

我喜欢这种方法,因为它提供了几种方案的解决方案(使用pk与否,留下一个条目等):

http://www.4guysfromrolla.com/webtech/sqlguru/q051200-2.shtml