1

我需要使用 MySQL 删除表中部分相似的行。前任:

来自 table1 (id,color1,color2,key) 内容:

id,color1,color2,key
-----------------------------
1,Blue,Green,AASDDD
2,Blue,Green,JJUUYYY
3,Blue,Red,HHYYY
4,Green,Red,KKIII
5,Blue,Red,KKIIUUUU

我想删除 color1,color2 中的重复行并获得:

id,color1,color2,key
-----------------------------
1,Blue,Green,AASDDD
3,Blue,Red,HHYYY
4,Green,Red,KKIII

就像是

delete FROM table1 WHERE Exists(SELECT color1,color2 FROM table1)

在不创建临时表的情况下在 MySQL 中执行此操作的最佳方法是什么?

(我知道有很多关于删除 MySQL 中重复行的帖子,但不是针对部分匹配的行。)

4

3 回答 3

8
DELETE FROM table1 
WHERE id NOT IN (SELECT min(id) 
                 FROM table1 
                 GROUP BY color1, color2)

编辑

MySQL 不能从具有同一表的子查询的表中删除。要解决该限制,您可以执行以下操作:

DELETE FROM table1 
WHERE id NOT IN (select * from (SELECT min(id) 
                               FROM table1 
                               GROUP BY color1, color2) t)
于 2012-07-18T10:53:22.927 回答
3
DELETE FROM table1 WHERE id NOT IN (SELECT min(id) FROM table1 GROUP BY color1, color2)

这里有 GROUP BY 的手册:http: //dev.mysql.com/doc/refman/5.0/en/group-by-functions-and-modifiers.html

教程:

笔记:

在 MySQL 中:

目前,您不能在子查询中从表中删除并从同一个表中选择。

至少对于 5.0 版本。( http://dev.mysql.com/doc/refman/5.0/en/delete.html )

因此,在 mysql 中,您可以在事务中使用TEMPORARY TABLE

BEGIN;
CREATE TEMPORARY TABLE colors_temp SELECT min(id) as id FROM table1 GROUP BY color1, color2;
DELETE FROM table1 WHERE id NOT IN (SELECT id FROM colors_temp);
DROP TABLE colors_temp;
COMMIT;
于 2012-07-18T10:55:05.327 回答
0
   DELETE FROM table1 
   WHERE id NOT IN (SELECT MIN(id) FROM table1 GROUP BY colo1, color2)
于 2012-07-18T11:06:02.760 回答