MySQL複数の重複レコードを検索して削除

6216 ワード

重複記録の出現は、通常、プログラムバックエンドの検証が厳格でないために発生したゴミデータに用いられ、クエリーして削除するには、以下のように実現することができる.
もっと素晴らしい
  • その他のテクニカルブログは、asing 1 elife’s blog
  • に移動してください.
    クエリーの繰り返しレコード
    クエリー指定フィールドが同じで合計数が1より大きいデータ
  • は、複数の
  • であることができる反復可能なフィールドを先に示す.
  • パケット照会結果に基づいて、HAVINGにより判断
  • を行う.
    SELECT 
    	msan.memberSurvey_id, 
    	msan.question_id, 
    	msan.option_id 
    FROM 
    	pt_member_survey_answer msan 
    GROUP BY 
    	msan.memberSurvey_id, 
    	msan.question_id, 
    	msan.option_id 
    HAVING 
    	COUNT(*) > 1
    

    上記のクエリ結果に基づいて重複データをすべて検出
  • 上記のクエリは、コンビネーションフィールドに重複する場合
  • を得る.
  • この状況に基づいて関連する具体的なデータバー数
  • を検索することができる.
    SELECT
    	msa.*
    FROM	
    	pt_member_survey_answer msa
    WHERE
    	(msa.memberSurvey_id, msa.question_id, msa.option_id) IN (
    		SELECT 
    			msan.memberSurvey_id, 
    			msan.question_id, 
    			msan.option_id 
    		FROM 
    			pt_member_survey_answer msan 
    		GROUP BY 
    			msan.memberSurvey_id, 
    			msan.question_id, 
    			msan.option_id 
    		HAVING 
    			COUNT(*) > 1
    	)
    ORDER BY
    	msa.memberSurvey_id ASC,
    	msa.question_id ASC,
    	msa.option_id ASC
    

    重複レコードの削除
    クエリが重複するデータidに関連する
    SELECT 
    	msan.id AS 'id' 
    FROM 
    	pt_member_survey_answer msan 
    GROUP BY 
    	msan.memberSurvey_id, 
    	msan.question_id, 
    	msan.option_id 
    HAVING COUNT(*) > 1
    

    クエリーされたデータidの削除
  • 注意ここで上記クエリ結果を直接取得するとYou can't specify target table for update in FROM clause異常
  • が投げ出す.
  • ですので、検索結果をSELECT包装する必要があります.
  • ができます.
  • 削除クエリーの結果は、重複する可能性のあるもののみをクエリーできます.同じ状況に2つ以上の重複データがある場合、1回の削除で完全にクリアできない場合は、複数回の削除文
  • を実行する必要がある場合があります.
    DELETE FROM
    	pt_member_survey_answer
    WHERE
    	id IN (
    		SELECT 
    			rs.id 
    		FROM (
    			SELECT 
    				msan.id AS 'id' 
    			FROM 
    				pt_member_survey_answer msan 
    			GROUP BY 
    				msan.memberSurvey_id, 
    				msan.question_id, 
    				msan.option_id 
    			HAVING COUNT(*) > 1
    		) rs
    	)