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 に答える