1

抱歉,我意识到我的标题令人困惑。请让我解释一下。

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

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

iID在哪里ab是另外两个字段。正如您在上面看到的,ID 2 和 ID 6 都具有a = 3b = 3。ID 1 和 ID 4 也是如此,两者都有 5 fora和 8 for b。即使 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 |

不要犹豫,询问更多详细信息,并提前致谢!

4

3 回答 3

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

于 2012-08-08T19:12:28.033 回答
2

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

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

要删除除最后输入的重复项之外的所有重复项,请将 Min 更改为 Max

于 2012-08-08T19:14:01.950 回答
1

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

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

于 2012-08-08T19:14:23.457 回答