在MySQL中删除部分相似的行

时间:2012-07-18 10:49:12

标签: mysql sql

我需要使用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和get:

中的重复行
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中重复行的帖子,但不是部分匹配行。)

3 个答案:

答案 0 :(得分:7)

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)

答案 1 :(得分: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中使用transaction

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;

答案 2 :(得分:0)

   DELETE FROM table1 
   WHERE id NOT IN (SELECT MIN(id) FROM table1 GROUP BY colo1, color2)