建议获得最佳查询性能(MySQL)

时间:2013-08-05 17:39:41

标签: mysql

我正在寻找针对这种情况的最佳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

我是对的?  还是有更好的东西?

由于

2 个答案:

答案 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对我原来答案的反馈