2

多対多のリレーション テーブルがあり、不要な行を削除する必要があります。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

ロジックが必要です。

4

2 に答える 2

0

この質問を締めくくります。探していた答えが見つかりませんでしたが、別の方法でやり終えました。データベースに未使用の行がないように、2日経過したこれらのレコードを削除することにしました。

于 2011-05-13T11:59:41.687 に答える
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つのSELECTに含まれていないレコードのみを削除する必要があります

于 2011-01-09T14:45:56.267 に答える