MySQL替代嵌套查询?

时间:2013-09-10 20:49:13

标签: mysql nested

我已经读过使用嵌套查询不是一个好主意,据说嵌套查询会大大减慢mysql的速度和类似的东西,所以我想我不应该使用嵌套查询,但是什么才是真正的替代是什么?

例如,我有一个评论评级系统,有助于将评价最高的评论带到顶部,它分为两个表:

存储评论的

comments comment_ratings存储评论ID和评分者。

注意:只有正面评分,所以如果comment_ratings表中有一条记录,则为+1。

所以现在,如果我想收集一些我喜欢的评论

SELECT stuff, (SELECT COUNT(*) FROM comment_ratings s WHERE s.id = c.id) as votes
FROM comments c
ORDER BY votes DESC

如果不使用嵌套查询,我该怎么做?

2 个答案:

答案 0 :(得分:2)

嵌套查询的好坏取决于具体情况。在您的特定示例中,如果您在comment_ratings(id)上有索引,则可能没有问题。也许那应该是comment_ratings(comment_id) - 这些表的命名约定很差。

您可以使用聚合查询替换它:

select c.*, count(cr.id) as votes
from comments c left join
     comment_ratings cr
     on c.id = cr.id
group by c.id
order by votes desc;

但是,由于MySQL实现group by的方式,这可能比原始查询更糟糕。我更喜欢 group by。对我来说,它更清楚地描述了你想要的东西,大多数其他数据库引擎都会很好地优化它。

答案 1 :(得分:1)

select stuff, count(*) as votes
from comments c, comment_ratings cr
where c.id = cr.id
group by stuff
order by votes desc; 

正如戈登所提到的,不要忘记没有评级的评论..去左联:

select stuff, count(cr.id) as votes
from comments c left join 
     comment_ratings cr on c.id = cr.id
group by stuff
order by votes desc;

http://sqlfiddle.com/#!2/79e54/2