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