1

Mysql テーブルからすべての重複行を削除したい。
しかし問題は、どの行が重複しているかわからなかったことです。
この Mysql テーブルには、約 500000 行の大きなデータ ラウンドが含まれています。
一部の行が重複しています。
これを行う方法を教えてください。

アップデート:

phpMyAdmin で実行する SQL クエリが必要です。
これが理解するための大まかな表です。
テーブル名がfooであるとします。

+---------------------------------------------------------------------+
| id |   link  |     title              |  description                |
+---------------------------------------------------------------------+
| 1  |  google |     search engine      |  search here free           |  
| 2  |  yahoo  |    also search engine  | findout web easily          |  
| 3  | Facebook|  connect with world    | meet with world             |  
| 4  | google  |  search engine         |  search here free           |
| 5  | msn     | Microsoft network      | network by MS               |
| 6  | google  | search engine          |  search here free           |
| 7  | msn     | Microsoft network      | network by MS               |
| 8  | yahoo   |  also search engine    | findout web easily          |
| 9  | myweb   |  my website            | ideal website               |
|... | ....    | .....continue....      | ..... ... .....             |
+---------------------------------------------------------------------+   

これは大まかなテーブルで、約 500000 行あるため、テーブルを完全に定義することはできませ
ん。
私はそのような大まかなクエリです。

DELECT all duplicate rows FROM foo

編集
この質問は重複としてマークされています。しかし、私はそれが一意だと思います。これとのリンクは重複しています。ユニークなインデックス。これがそのコードです

  ALTER IGNORE TABLE jobs ADD UNIQUE INDEX idx_name (site_id, title, company );  

この後、データを追加するたびにこのクエリを実行すると、Mysql はそれが既に存在するかどうかを確認し、存在する場合は追加を停止します。
このクエリを使用すると、テーブルに大きなデータが含まれていることを既に説明しました。その後、テーブルに1つの結果を追加すると、テーブル全体がチェックされ、約500000行が一意になるため、遅くなります.1つだけですこれが10の場合は新しいレコード、または100000の新しいレコードを入力したい場合は、遅くなりすぎます。
そして、私はそれらのほとんどがクラスを含んでいる他の答えを見ますHAVING.それはすでに遅いです.

4

2 に答える 2

7

おそらく、DELETE で JOIN を使用して、副選択に対して結合することができます。

多くの助けを得るには、より多くの詳細が必要ですが、大まかなアイデアは次のとおりです。

DELETE result 
FROM result
INNER JOIN (SELECT SomeField, COUNT(*) AS RecCount, MAX(DateAddded) AS MaxDateAdded FROM result GROUP BY SomeField) b
ON result.SomeField = b.SomeField AND a.DateAdded != b.MaxDateAdded

これは、対応する最大日付が追加されたSomeFieldのすべての出現を見つけ、その最大日付に一致しないものを削除します。

最新の記録を残したいと思います。

このような一括削除は少し心配です。間違えると、すべてのレコードが削除される可能性があるためです。

EDIT - あなたが今与えたテーブルと一緒に行くバージョン。これにより、重複が削除され、同じ最初のものが残ります(つまり、Googleの場合、IDが1の行が残ります)

DELETE foo 
FROM foo
INNER JOIN (SELECT link, title, description, MIN(id) AS MinId FROM foo GROUP BY link, title, description ) b
ON foo.link = b.link
AND foo.title = b.title 
AND foo.description = b.description
AND foo.id != b.MinId
于 2013-04-16T07:29:55.660 に答える