我知道如何找到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'),
但我正在寻找更好的解决方案
答案 0 :(得分:0)
考虑您对50,000行的评论。我认为最值得注意的是索引。只要commentable_id
,rateable_id
和article_id
被编入索引(当然假设articles.id
是主键),您应该相对快速查询。
就简化而言,最易读的代码(同样会更慢)将使用关系或连接与fluent一起查找计数。即
之类的东西$articles->comments()->count()
此外,如果您正在处理可能增长到数百万行的大型数据,并且您需要执行类似排序的功能,那么使用摘要表会更好。或者,您可以添加commentCount
,avgRating
和favoriteCount
等字段。运行这些聚合并使用它来一直对数据进行排序的开销实在太多了。