2016-11-14 11 views
1

私は約0.5〜100万レコードのテーブルを持っています。テーブルには、varcharフィールドによる重複レコードがあります。後半の重複レコードを検索して削除する

ID int(11) 
TITLE varchar(100) 
よう

何か

重複TITLE値を持っている多くのレコードがあります。

重複するレコードを削除する必要があります。最初のステップはそれらを見つけることです。

  1. SELECT ID, TITLE FROM MY_TABLEを使用してレコードによってGROUP BY TITLE HAVING COUNT(*) > 1

  2. ゴーレコードを使用するには、その後、各レコードのSELECT ID FROM MY_TABLE WHERE TITLE='".$row['TITLE']." AND ID <> '".$row['ID']."'

を使用する質問はどの方法があるということである:私はそこに2つの方法があるとし効率的ですか?

さらに効率的な方法がありますか?

私はphpを基本言語として使用しています。

+0

削除したいものはどれですか?後者か前者? – 1000111

+0

後で大丈夫です –

答えて

6

を使用します。

DELETE B 
FROM your_table A 
INNER JOIN your_table B ON A.TITLE = B.TITLE AND A.ID < B.ID. 

このクエリはすべて後者の重複を削除します最初のものを維持しながら記録する。以前のすべての重複レコードを削除中に最新に保つために


DELETE A 
FROM your_table A 
INNER JOIN your_table B ON A.TITLE = B.TITLE AND A.ID < B.ID. 

EDIT:あなたは後者(重複を確認したい場合は

)レコードは削除操作を実行する前に削除され、次のクエリを実行します。

SELECT B.* 
FROM your_table A 
INNER JOIN your_table B ON A.TITLE = B.TITLE AND A.ID < B.ID. 

これは、すべての新しいID年代がIDの前よりもより大きくなることを前提としています。 A かなり安全な前提ですが、注意が必要です。

ありがとうございます。

+0

実際の削除を実行する前に、どのレコードが削除されるかを見る方法はありますか?SELECT B. * ...できますか... ... –

+1

**編集**セクションの更新された回答を確認してください。 – 1000111

+0

これは便利な答えだと思います。私は試して受け入れます...ありがとうございます。 –

0

このクエリを使用することができます(同じタイトルを持つ)すべての重複レコードを削除するためには、SQL以下

DELETE FROM MY_TABLE WHERE ID NOT IN (SELECT MIN(x.ID) FROM MY_TABLE x GROUP BY x.TITLE); 
+0

私はそれが重複していても重複していなくても、削除すべきではないすべてのIDを与える最も内側のクエリを理解しています...しかし、私は2つのことを理解していません... 'SELECT * FROM(...)y' ...?第2は、xを使う理由です。内側のほとんどのクエリで...? –

+0

または言い換えれば、どのようにこのクエリを説明することができます... –

+0

私は30Mレコードにこのクエリを使用するといくつかのエラーが発生しました。 1093エラーが表示されない場合は、この部分をスキップできます。 また、このクエリを使用して削除するレコードを表示する場合は、同じクエリで 'DELETE'を' SELECT'に置き換えてクエリを実行してください。 – Naga

関連する問題