获得GroupBy Laravel的平均数

时间:2017-12-21 12:07:26

标签: php mysql sql laravel

我试图制作评论系统,我希望在使用分组时获得计数(id)的平均值

如果我按小组使用计数,则可以使用

return $comments  = Comment::select('rating',DB::raw('count(id)  as 
total_reviews'))->where('product_id', $id)->where('shop_name', $shop)-
>groupBy('rating')->get();

结果

  [
{
"rating": 1,
"total_reviews": 1
},
{
"rating": 2,
"total_reviews": 2
},
{
"rating": 3,
"total_reviews": 2
},
{
"rating": 4,
"total_reviews": 6
},
{
"rating": 5,
"total_reviews": 61
}
]

但是当我添加avg()时出现错误

return $comments = Comment::select('rating',DB::raw('avg(count(id))
as total_reviews'))->where('product_id', $id)->where('shop_name', $shop)-
>groupBy('rating')->get();
  

常规错误:1111无效使用组功能(SQL:select   rating,avg(count(id))为来自comments

的total_reviews

4 个答案:

答案 0 :(得分:0)

Laravel Documentation中有一个很好的例子可以做类似的事情来检查:

$users = DB::table('users')
                     ->select(DB::raw('count(*) as user_count, status'))
                     ->where('status', '<>', 1)
                     ->groupBy('status')
                     ->get();

使用数据库外观以这种方式尝试,并告诉我发生了什么。

答案 1 :(得分:0)

你不能在Mysql中组合聚合函数,你必须使用子查询: Look here

答案 2 :(得分:0)

您正在尝试平均每行的计数,这没有意义。 尝试使用子选择:http://sqlfiddle.com/#!9/8f4f8e/4

答案 3 :(得分:0)

我认为不支持嵌套聚合函数。所以,您可以尝试这样的集合平均方法:

$average_rating = Comment::select('rating','product_id','shop_name',
                   DB::raw('count(id) as total_counts'))
                  ->where('product_id', $id)
                  ->where('shop_name', $shop)
                  ->groupBy('rating')
                  ->get()
                  ->avg('total_counts');

此处,最多get()您将收到包含每个评分总数的集合,然后avg()将搜索total_counts值并对其进行平均。

我希望你理解。您可以查看文档https://laravel.com/docs/5.5/collections#method-avg