2012-08-08 83 views
1

对不起,我意识到我的标题很混乱。请让我解释一下。删除有两个重复字段但没有重复ID的MySQL行

我有一个看起来像这样的数据库:

| 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有5个。即使身份证号码不同,我仍然认为这些行是重复的,并希望所有行都被删除。无论哪一个都没关系,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
delete from your_table 
where i not in 
(
    select * from 
    (
     select min(i) 
     from your_table 
     group by a, b 
    ) x 
) 

MySQL无法从它正在从中选择的表中删除。这就是为什么我做了一个subquery的选择与select * from() x

+0

太漂亮了!谢谢,这个工作非常出色。我永远在你的债务。 – 2012-08-08 19:25:23

2

首先。清理完表后,在列a和b上放置一个备用密钥索引,以确保更多重复记录不会添加到表中......但是,如上所述,删除最后输入的重复项需要

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

要删除所有,但最后输入的重复数据删除,更改最低到最高

+0

您的意思是“唯一”键而不是“替代”键吗? – 2012-08-08 19:29:25

+0

@marcus,不,替代键用于表示除“主”键之外的另一个键......工作“键”本身意味着唯一性。 – 2012-08-08 19:38:39