Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除具有两个重复字段但没有重复ID的MySQL行_Mysql_Sql_Duplicates - Fatal编程技术网

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

删除具有两个重复字段但没有重复ID的MySQL行,mysql,sql,duplicates,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 | a | b | | i | a | b | | 3 | 3 | 6 | | 1 | 5 | 8 | | 4 | 5 | 8 | or | 2 | 3 | 3 | |

对不起,我意识到我的标题令人困惑。请让我解释一下

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

| i | a | b |
| 1 | 5 | 8 |
| 2 | 3 | 3 |
| 3 | 3 | 6 |
| 4 | 5 | 8 |
| 5 | 1 | 1 |
| 6 | 3 | 3 |
| 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 |
其中i是ID,a和b是另外两个字段。如上所示,ID2和ID6都有a=3和b=3。ID 1和ID 4也是如此,都有5表示a,8表示b。即使ID号不同,我仍然认为这些行是重复的,并且希望除了删除一个以外,所有的行都是重复的。不管是哪一个,身份证号码不必改变来弥补差距,但我并不反对

如果有一个查询能让上面的例子变成这样,我会很高兴:

| i | a | b |
| 1 | 5 | 8 |
| 2 | 3 | 3 |
| 3 | 3 | 6 |
| 4 | 5 | 8 |
| 5 | 1 | 1 |
| 6 | 3 | 3 |
| 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 |
请不要犹豫,提前询问更多细节和感谢

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对子查询select


MySQL无法从正在选择的表中删除。这就是为什么我首先使用select*from x对select进行子查询的原因。清理完表后,在a列和b列上放置备用键索引,以确保不会向表中添加更多重复记录。。。但是,尽管如此,要删除上次输入的重复项,您需要

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

要删除除上次输入的复制外的所有复制,请首先将最小值更改为最大值。清理完表后,在a列和b列上放置备用键索引,以确保不会向表中添加更多重复记录。。。但是,尽管如此,要删除上次输入的重复项,您需要

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

要删除除最后输入的重复项以外的所有重复项,请将最小值更改为最大值。我喜欢这种方法,因为它为多种场景提供了解决方案,无论是否使用pk,保留一个条目,等等:


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


美丽的谢谢,这非常有效。我永远欠你的债。美丽!谢谢,这非常有效。我永远欠你的债。@marcus,不,备用钥匙是用来指主键以外的另一把钥匙。。。工作键本身意味着唯一性。@marcus,不,备用键用于表示主键以外的另一个键。。。工作键本身意味着唯一性。