我正在寻找针对这种情况的最佳MySQL查询:
我列出了会员的最后10篇帖子。
table for posts:
post_id | uid | title | content | date
会员可以订阅其他会员帖子,以便帖子列在同一个列表中(按日期排序 - 相同的表格)
因此可以选择用户ID X和用户ID Y的最后帖子 但是我想允许会员显示一些帖子(他不想显示的帖子)。
我的问题是:我怎样才能让MySQL变得尽可能简单?...我想到了第二个表格,其中我放置了用户不想要的帖子ID:
table postdenied
uid | post_id
然后选择如下:
select * from posts as p where not exists (select 1 from postdenied as d where d.post_id = p.post_id and d.uid = p.uid) order by date DESC limit 10
我是对的? 还是有更好的东西?
由于
答案 0 :(得分:3)
如果我理解正确,posts.uid
列会存储海报的ID。并且postdenied.uid
存储不希望看到某个帖子的用户的ID。
如果上述假设是正确的,那么您的查询就可以了,但您不应加入uid
列,只能加入post_id
列。你应该有一个参数或常量用户ID(在下面的代码中标注为@X
)你要显示所有帖子的用户 - 除了那些他被“拒绝”的帖子:
select p.*
from posts as p
where not exists
(select 1
from postdenied as d
where d.post_id = p.post_id
and d.uid = @X -- @X is the userID of the specific user
)
order by date DESC
limit 10 ;
答案 1 :(得分:1)
实现此目的的另一种方法是使用LEFT JOIN
子句。
SELECT * FROM posts AS p
LEFT JOIN postdenied as d ON d.post_id = p.post_id and d.uid = p.uid
WHERE d.uid IS NULL
ORDER BY date DESC
LIMIT 10
我不清楚这是否更适合查询优化器。如果您有大量数据,那么可能值得测试两个查询并查看一个查询是否比另一个更高效。
请参阅http://sqlfiddle.com/#!2/be7e3/1
感谢ypercube和Lamak对我原来答案的反馈