选择用户之前没有见过的帖子

时间:2012-11-17 23:48:00

标签: php mysql yii

我正在寻找创建以下功能的最有效方法。用户将加载一个页面,该页面将为他们提供随机帖子(来自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语句也会有所帮助。

2 个答案:

答案 0 :(得分: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的索引。不必是主要的,只需要某种索引来加速请求。

答案 1 :(得分: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实际上可能在这里更有意义......如果你只想要1个帖子,我会加上你的LIMIT 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