6

設定テーブルに重複する値がいくつかあるように見えるので、各ユーザーの重複するエントリをすべて削除したいのですが、より新しいものです。私は解決策を考え出すのにかなりの時間を費やしましたが、ただ円を描いて走り回っています. 最大、グループ化、サブクエリなどを試しました。最高のものを削除するのは非常に簡単ですが、最高のもの以外はすべてではありません。特に各ユーザーにとって

したがって、データベースには次のものが含まれている可能性があります。

id  :   name:       value   :   userId
1   :   sortOrder:  Asc     :   1
2   :   sortOrder:  Desc    :   1
3   :   sortOrder:  Asc     :   2
4   :   something:  value2  :   1

したがって、この場合、最初の行はユーザー 1 と重複しており、最も高い ID を持ち、残りのすべての列を保持するため、最初の行を削除します。

したがって、少なくとも group by を使用したサブクエリであることはわかっていますが、それを理解することはできません。これまでのところ、私は持っています:

SELECT 
    MAX(id),
    name
FROM 
    preference
GROUP BY
    name

これにより、保持したいリストが表示されますが、ユーザーごとにまだ欠落しています。したがって、ユーザーごとに持っている場合は、反対のことがいくらか必要です。ただし、とにかくサブクエリで <> を使用できるとは思いません。

私が最終的にやりたいことは、重複したエントリである同じユーザーの ID が低いものをすべて削除することです。

4

1 に答える 1

11

1 つの方法として、Id列が一意の ID であると仮定します。

DELETE FROM preference
where Id NOT IN (SELECT MAX(id) FROM preference GROUP BY name, userId)

[注: 通常のアドバイスが適用されます。 最初にテストせずに本番環境で実行しないでください]

最初に次を使用してテストします。

SELECT * FROM preference
where Id NOT IN (SELECT MAX(id) FROM preference GROUP BY name, userId)

SQLFiddle はこちらです。意図したとおりに動作します。ただし、より大きなデータセットでテストすることをお勧めします...

于 2013-04-27T02:06:48.250 に答える