2011-01-05 11 views
2

多対多リレーションテーブルがあり、不要な行を削除する必要があります。 lastviewsテーブルの構造は次のとおりです。2つの条件でテーブルから不要な行を削除する

| user (int) | document (int) | time (datetime) | 

このテーブルには、ドキュメントを見た最後のユーザーをログに記録します。 (ユーザー、文書)が一意です。私は、ドキュメントの唯一最後の10の図を示し、今まで私はこのような不要な削除:

DELETE FROM `lastviews` WHERE `document` = ? AND `user` NOT IN (SELECT * FROM (SELECT `user` FROM `lastviews` WHERE `document` = ? ORDER BY `time` DESC LIMIT 10) AS TAB) 

は、しかし、今私はまた最後の5ユーザーが視聴した文書を示すために必要があります。これは、以前のクエリを使用して行を削除することができないということです。必要な情報が削除される可能性があります(ユーザーが5分でドキュメントを表示せず、行が削除されたとします)。

要約すると、これら2つのクエリの結果ではないレコード:

SELECT ... FROM `lastviews` WHERE `document` = ? ORDER BY `time` DESC LIMIT 10 

SELECT * FROM `lastviews` WHERE `user` = ? ORDER BY `time` DESC LIMIT 0, 5 

私はロジックを必要としています。

+0

もちろん、私はいつも同じ構造で2番目のテーブルを作成できますが、それはちょうどいい気分ではありません。 – stormbreaker

+0

これは間違いなく、テンポラリテーブルを作成する場合です。 :) – Riedsio

+0

これは、各 'document'と' user'(最後の10行または5行を取得するために)のINSERT文を使わずに、一時テーブルに行を挿入する方法を質問します。少なくとも、クエリをループさせてください。 – stormbreaker

答えて

0

を必要とすることを選択します。私は、私が探していた答えを見つけられませんでしたが、別の方法でそれをやり終えました。 2日前のこれらのレコードを削除して、データベースに未使用の行がないようにすることにしました。

0

クエリでORが問題を解決できますか?

このような何か:

DELETE FROM `lastviews` WHERE `document` = ? AND (`user` NOT IN (SELECT * FROM (SELECT `user` FROM `lastviews` WHERE `document` = ? ORDER BY `time` DESC LIMIT 10) AS TAB) OR 'user' NOT IN (SELECT * FROM (SELECT 'user' FROM `lastviews` WHERE `user` = ? ORDER BY `time` DESC LIMIT 0, 5) AS TAB)) 

ので、それは2に含まれていないレコードだけを削除する必要がありますが、あなたが、私はこの質問を閉じてい

+0

これには、ユーザーIDを与える必要があります。したがって、このユーザーにのみ必要な数の行が保持されます。他の人は削除される可能性があります。 – stormbreaker

関連する問題