2

我读过使用嵌套查询不是一个好主意,据说嵌套查询会大大降低 mysql 的速度,所以我认为我不应该使用嵌套查询,但真正的替代方法是什么?

例如,我有一个评论评分系统,它有助于将评分最高的评论放在首位,它分为 2 个表格:

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

如果不使用嵌套查询,我将如何做到这一点?

4

2 回答 2

2

嵌套查询的好坏取决于具体情况。在您的特定示例中,如果您有一个索引 on 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对我来说,它更清楚地描述了您想要什么,并且大多数其他数据库引擎都会很好地优化它。

于 2013-09-10T21:00:10.827 回答
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

于 2013-09-10T20:59:52.550 回答