使用2个条件从表中删除不需要的行

时间:2011-01-05 19:49:25

标签: mysql subquery field sql-delete nested-queries

我有一个多对多关系表,我需要删除不需要的行。 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分钟内没有查看文档而行被删除)

总之,我需要删除不在这两个查询结果中的所有记录:

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

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

我需要逻辑。

2 个答案:

答案 0 :(得分: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))

所以它应该只删除你需要的两个SELECT中没有的记录

答案 1 :(得分:0)

我正在结束这个问题。我没有找到我正在寻找的答案,但结束了另一种方式。 我决定删除这些2天的记录,这样数据库中就不会有任何未使用的行。