获取 Laravel 中其他特定列的最大值、最小值、平均值



我的表看起来像这样。

id | restaurant_id | user_id  | rating | comment 
1        1              2          3.5     comment1
2        1              2          2.1     comment2
3        1              2          4.1     comment3
4        1              2          1.6     comment4

现在,我restaurant_id为1。 我想要的是获得最高评级(4.1),最低评级(1.6)和平均评级(无论它是什么)。我这样做是正确的,但我也想得到评论。像这样:

{
"data": [
max:{
max_rating:4.1,
comment:"comment 3",
id: 3
},
min:{
min_rating:1.6,
comment: "comment 4",
id: 4,
}
avg:{
avg_rating:"whatever it is",
//this won't have comment and id at all.
}
]
}

我试过了:

$data = AppHttpModelsReview::select("id", "comment",DB::raw("MAX(rating) AS max_price, MIN(rating) AS min_price"))
->where("restaurant_id", 1)
->groupBy("id")
->get();

但不像我解释的那样工作。

更直接的解决方案是执行 3 个单独的查询:

$avg = Review::select(DB::raw('avg(rating) as avg_rating')
->where('restaurant_id', 1)
->groupBy('restaurant_id')
->get();
$max = Review::select('id','comment','rating')
->where('restaurant_id', 1)
->orderBy('rating','DESC')
->first();
$min = Review::select('id','comment','rating')
->where('restaurant_id', 1)
->orderBy('rating','ASC')
->first();
$json = json_encode(['data' => [
'avg' => $avg,
'max' => $max,
'min' => $min
]]);

您可以使用单个查询提取最大值、最小值和平均值,但不包括最大值/分钟的 id 和注释:

$stats = Review::select(DB::raw('avg(rating) as avg_rating, max(rating) as max_rating, min(rating) as min_rating')
->where('restaurant_id', 1)
->groupBy('restaurant_id')
->get();

我会尝试这些:

$average = AppHttpModelsReview::where("restaurant_id", 1)->avg('rating');
$max = AppHttpModelsReview::where("restaurant_id", 1)->max('rating');
$min = AppHttpModelsReview::where("restaurant_id", 1)->min('rating');

如果您需要同时计算许多餐厅的这些值,则消息中编写的查询将是一个良好的开端。它给你什么结果而不是预期的值?

一种在一次查询中获取最小值、最大值和平均值的简单方法 拉拉维尔

$stats=stats::where('userid',Auth::User()->id)->get();
$min=$stats->min('point');
$max=$stats->max('point');
$avg=$stats->avg('point');

最新更新