在MySql中查找所选项目的最快方法?

时间:2016-07-12 11:15:29

标签: mysql sql laravel laravel-4 count

我知道如何找到COUNT,AVG功能的工作想要我想在这里实现另一个操作,在找到计数后请看下面的代码。

Article::where('id','=',130)
            ->select(
                'articles.*',
                DB::raw('(SELECT avg(rating) FROM rating WHERE rateable_id = articles.id AND type = "article"  ) as avgRating'),
                DB::raw('(SELECT count(*) FROM comments WHERE commentable_id = articles.id AND commentable_type = "article") as commentCount'),
                DB::raw('(SELECT count(*) FROM article_favourites WHERE article_id = articles.id ) as favouriteCount')
            )
            ->get();

使用上面的查询,我可以得到'avgRating','commentCount','favouriteCount',但我也希望得到这三个的总和..即类似:

(avgRating + commentCount + favouriteCount) AS Sum

最好的方法是什么? PS:我已经有了解决方案

DB::raw('( (SELECT avg(rating) FROM rating WHERE rateable_id = article.id AND type = "article")+(SELECT count(*) FROM comments WHERE commentable_id = article.id AND commentable_type = "'.$type.'")+(SELECT count(*) FROM article_favourites WHERE article_id = article.id) ) as totalCount'),

但我正在寻找更好的解决方案

1 个答案:

答案 0 :(得分:0)

考虑您对50,000行的评论。我认为最值得注意的是索引。只要commentable_idrateable_idarticle_id被编入索引(当然假设articles.id是主键),您应该相对快速查询。

就简化而言,最易读的代码(同样会更慢)将使用关系或连接与fluent一起查找计数。即

之类的东西
$articles->comments()->count()

此外,如果您正在处理可能增长到数百万行的大型数据,并且您需要执行类似排序的功能,那么使用摘要表会更好。或者,您可以添加commentCountavgRatingfavoriteCount等字段。运行这些聚合并使用它来一直对数据进行排序的开销实在太多了。