2016-04-23 10 views
2

これを行う方法を見つけようとしていますが、どうやって解決するかわかりません。 次の表は、「クリーンアップ」しようとしているものです。フィールドごとに最後の10個を除くすべてのレコードを削除します

基本的には、user_idあたりの最新のメッセージを除くすべてのメッセージを削除します。 私は本当にこれについてどうやって行くのか分かりません。

提案が役に立ちます。私はこれが動作するかどうかわからないけど、あなたにそれを行うことができる方法のアイデアを与えるかもしれない

delete from messages where ID = (SELECT ID FROM messages 
ORDER BY timestamp DESC 
LIMIT 10) 

-

+0

本当にやりたいですか?どうして? – Strawberry

+0

この表には200万件を超えるレコードがあり、ユーザーあたり10人以上を保持する用途はありません。彼らは決して表示されず、必要とされることもありません。 – Roel

答えて

-2

はこのような何かを試してみてください。 私はこれが役立つことを願っています。

+0

'='を使用すると、サブクエリは単一のIDを返す必要があります。しかし、サブクエリは10個のIDを返します。 – Barmar

+0

これはそれぞれの 'user_id'に対して別々に動作しません。 – Barmar

-1

すべてのユーザーにこれを繰り返す必要があります。

DELETE FROM Messages where user_id='xyz' and ID NOT IN 
    (SELECT * FROM 
    (SELECT ID FROM Messages where user_id='xyz' ORDER BY timestamp DESC LIMIT 10) 
    AS TOP10) 
+0

MySQLは 'IN'と' NOT IN'で使用されるサブクエリで 'LIMIT'を許可しません。 – Barmar

+1

それぞれのuser_idに対して個別のクエリを記述する必要はありません。 – Barmar

2

は、各user_idのために、最新の10行を検索クエリを作成する方法についてはUsing LIMIT within GROUP BY to get N results per group?を参照してください。次に、サブクエリとして結合するクエリを記述し、それに含まれていない行を削除することができます。

DELETE t1.* 
FROM YourTable AS t1 
LEFT JOIN (SELECT ...) AS t2 
ON t1.id = t2.id 
WHERE t2.id IS NULL 

(SELECT ...)を他の質問にあるクエリに置き換えてください。

関連する問題