我需要使用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中重复行的帖子,但不是部分匹配行。)
答案 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)