我已经读过使用嵌套查询不是一个好主意,据说嵌套查询会大大减慢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
如果不使用嵌套查询,我该怎么做?
答案 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;