我试图制作评论系统,我希望在使用分组时获得计数(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
的total_reviewsrating
,avg(count(id))为来自comments
的
答案 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