2017-01-03 18 views
1

データベース変換スクリプトを作成する際に重複レコードが存在するという問題が発生しました。私の目的はこれらを見つけて重複を削除することです。私はSQLの専門家ではないので、アドバイスのabitを求める!同じテーブルから選択して削除する

私が見つけるために、これまでに出てくると(GROUP_NAMEとレベルがあれば)同じです。この

DELETE FROM achievements 
WHERE group_name IN (SELECT concat(group_name, level) 
        FROM achievements 
        GROUP BY group_name, level 
        HAVING count(*) >1); 

である。しかし、それは私に次のエラーを与える重複レコードを削除することができた最高のもの

【のErr] 1093 - 表「成果」が「削除」のための標的として、およびデータ

ための別個の供給源はここにあるように、両方の、2回指定されています私の現在のデータ。 https://gist.github.com/Diddyy/13842901c830c19c21488613c9d27c92

そのデータには、3つの重複があります(group_nameの後にレベルが続きます)。同じ名前とレベルを持つエントリが既に存在するように複製として
ACH_CameraPhotoCount 5
ACH_FootballGoalScoredInRoom 1
ACH_FootballGoalScoredInRoom 2

Iクラスこれら。

私の最終結果は、3つの重複を削除しますが、各重複の1つを残して、まだ存在します。

重複するgroup_nameは許可されています。重複レベルは許可されます。しかし、私が望んでいないのは、同じレベルのgroup_nameが2回以上あることです。

私はこれについての解決策を考え出すことができません。また、私はコンカットが最良の方法であると確信していませんか?

すべてのソリューションには、ありがとうございます!

+0

することができますこれは、行を "複製" を保持し、最低レベルとの1が言いますサンプルデータと望ましい結果を提供しますか? –

+0

@GordonLinoff情報を追加しました、謝罪します! –

答えて

1

MySQLで重複を削除する通常の方法は、joinを使用することです。以下削除し回以上発生したすべてのgroup_name S:

delete a 
    from achievements a join 
     (select group_name, min(level) as minlevel 
      from achievements a 
      group by group_name 
      having count(*) > 1 
     ) aa 
     on a.group_name = aa.group_name; 

以下がより一般的であるものを行います。

delete a 
    from achievements a join 
     (select group_name, min(level) as minlevel 
      from achievements a 
      group by group_name 
      having count(*) > 1 
     ) aa 
     on a.group_name = aa.group_name 
    where a.level > aa.level; 

EDIT:

あなたがgroup_namelevelで同じことを行うことができます

delete a 
    from achievements a join 
     (select group_name, level, min(id) as minid 
      from achievements a 
      group by group_name, level 
      having count(*) > 1 
     ) aa 
     on a.group_name = aa.group_name and a.level = aa.level 
    where a.id > aa.minid; 
+0

これは私が望んでいる最終結果を持っていないようです。私が正確に達成したいことを説明しなかったので、それは私のせいでした。私はgroup_name +レベルがすでに存在していない重複を削除したいと思っています。私のデータの例は、ACH_CameraPhotoCount - 5です。これは、レベル5のgroup_name ACH_CameraPhotoCountのエントリが既に存在するため、重複しています。ごめんなさい! –

+0

あなたの時間とソリューションに感謝して、私が望んでいたものをまさに実現しました! –