2011-01-05 62 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

當然,我總是可以創建一個具有相同結構的第二張桌子,但這只是感覺不對。 – stormbreaker 2011-01-05 20:49:14

+0

這絕對是創建臨時表的一種情況。 :) – Riedsio 2011-01-05 23:36:21

+0

這帶來了如何在臨時表中插入行而不必爲每個'document'和'user'執行INSERT語句(獲取最後10行或5行)的問題。或者至少讓查詢做循環。 – stormbreaker 2011-01-06 06:35:08

回答

0

,我關閉了這個問題。我沒有找到我正在尋找的答案,但以另一種方式結束了。 我決定刪除這些2天以前的記錄,因此數據庫中不會有任何未使用的行。

0

在您的查詢中是否可以解決您的問題?

是這樣的:

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)) 

所以應該只刪除未包含在這兩個記錄選擇需要

+0

這需要我給它一個用戶ID。所以它只會爲這個用戶保留所需的行數。其他人可能會被刪除。 – stormbreaker 2011-01-09 16:40:10