2011-09-07 25 views
8

テーブルに511の重複がありますが、これらは削除する必要がありますが、オリジナルは削除する必要があります。したがって、私はすべての複製のすべての2番目の発生を削除したいと思います。MYSQLテーブルからの重複を削除

どうすればいいですか?

TABLE:

code/ status/ time 
E3F4FF928A/0/
07D95444BB/0/ 
07D95444BB/ 0/
40006C128F/0/1315293012 
2B45790E52 /0/
40006C128F/0/1315293012 
+0

テーブル定義を投稿してください。 –

+1

これらは正確に重複しているのですか、またはそこに固有の鍵がありますか? – Jason

+1

真の複製物は、元の複製物とまったく同じです。本当に重複しているのですか、またはデータの多くが同じですが、auto inc列や作成された日付のようなものが異なる行がありますか? – Zak

答えて

8

は一意である必要があり、列の表に一意のインデックスを追加して、無視するエラー

alter ignore table X add unique index (column_a) 

http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

+0

は対応していません*すべての複製の2回目の発生をすべて削除したい* –

+0

これは望ましい結果を達成しません。 –

+1

より具体的にするとあなたはa b c b aを持っています。あなたはb cを望んでいますか、またはb c bを望みますか? – Zak

0
DELETE t2 FROM table1 t2 
INNER JOIN table1 t1 ON 
     (t1.somefield = t2.somefield 
    AND t1.otherfield = t2.otherfield /*add more fields if need be */ 
    AND t2.id > t1.id) 
LEFT JOIN table1 t3 ON 
     (t1.somefield = t3.somefield 
    AND t1.otherfield = t3.otherfield /*add more fields if need be */ 
    AND t3.id > t2.id) 
WHERE (t3.id IS NULL) 
ORDER BY t2.id ASC 

これはのみ削除してください第2回目は複製し、第3回目以降は重複を避けてください。

あなたはあまり難解な何かをしたい、とあなたはtimestamp列を持っている、おそらくあなたは

DELETE t2 FROM table1 t2 
INNER JOIN table1 t1 ON 
     (t1.somefield = t2.somefield 
    AND t1.otherfield = t2.otherfield /*add more fields if need be */ 
    AND t2.`timestamp` > t1.`timestamp`) 
WHERE (1=1)  /*In some mode(s) MySQL requires a where clause with delete*/ 
ORDER BY t2.id ASC 
1

を行いたい場合は、単に今日この問題に(テーブルに一意のキー)を実行していません。

は、私はこの

DELETE FROM table where code=x and status=y and time=z LIMIT 1; 

のようにそれを解決した。これは、与えられた基準のために最初の1行を削除します(あなたはn個の重複がある場合、一つだけを維持するためのn-1を入れます)。

+0

質問には答えません – chuse

関連する問題