質問

多対多のリレーションテーブルがあり、不要な行を削除する必要があります。の 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に含まれていないレコードだけを削除する必要がありますので、
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top