2 つの条件を使用してテーブルから不要な行を削除する
-
25-09-2019 - |
質問
多対多のリレーションテーブルがあり、不要な行を削除する必要があります。の lastviews
テーブルの構造は次のとおりです。
| 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
ロジックが必要です。
解決 2
私はこの質問を閉じています。私は私が探していた答えを見つけるが、それを別の方法をやって終了しませんでした。 私は、データベース内の未使用の行がありませんので、2日古いですこれらのレコードを削除することを決定します。
他のヒント
したり、クエリの解決であなたの問題?
このような何かます:
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つのSELECTに含まれていないレコードだけを削除する必要がありますので、所属していません StackOverflow