0

我正在寻找创建以下功能的最有效方法。用户将加载一个页面,这将为他们提供一个随机帖子(来自 user_post 表),但必须排除他们之前查看过的帖子。我的数据结构是(简化的):

user_post
---------
id (PK)


user_post_view
--------------
id (PK)
user_id
user_post_id

其中 user_post 是存储的帖子,而 user_post_view 是将用户与他们查看过的帖子相关联。因此,用英语查询将是:

从 user_post 表中选择一个没有 user_post_view 记录的随机帖子

我正在使用 Yii 框架,但即使是“普通”的 SQL 语句也会有所帮助。

4

2 回答 2

1
SELECT * FROM user_post p where 
your_user_id NOT IN (SELECT user_id FROM user_post_view WHERE user_post_id = p.id)

编辑:

EXISTS 实际上在这里可能更有意义......我添加了你的 LIMIT 1 以防你只想要 1 个帖子

SELECT * FROM user_post p where 
NOT EXISTS (SELECT user_id FROM user_post_view WHERE user_post_id = p.id AND 
user_id = your_user_id) LIMIT 1
于 2012-11-17T23:56:17.167 回答
1
SELECT p.* FROM user_post p LEFT JOIN user_post_view pv ON (pv.user_id = your_user_id_here AND pv.user_post_id = p.id) WHERE pv.user_id = NULL

应该做的伎俩。它尝试与 user_post_view 表进行 LEFT JOIN。如果失败,连接右侧的所有字段都将为空。我正在利用这个优势。

为了提高效率,请确保您有一个索引 user_id、user_post_id 的索引。不必是主要的,只是某种加速请求的索引。

于 2012-11-17T23:51:24.480 回答