Laravel 查询生成器中计算的第二个平均值的平均值
Average of a calculated second average in Laravel Query Builder
我有 3 个表:约会、评论、Review_ratings
每个 review_ratings 都有一个评级值。每个评论都有很多 review_ratings 最后,每个约会都有很多评论。
我想做的是计算每个评论review_ratings的平均值,然后计算评论总评分的平均值,看它是否高于特定整数。
例子:
预约 ID:1,有 2 条评论,每条评论有 review_rating 4 和 3 之一,评论评分 2 为 5 和 5。
AVG(review_ratings) 应该 return average(5,5) 和 average(4,3) 之间的平均值是 3.5 然后 AVG(the_first_avg) 应该 return 平均值 (3.5,5) 即 4.25.
我最后测试的查询是:
if($minRating > 0){
$search->join('appointments','appointments.doctor_id','users.id')
->join('reviews','reviews.appointment_id','appointments.id')
->join('review_ratings','review_ratings.review_id','reviews.id')
->addSelect(array('review_ratings.id',
DB::raw('AVG(review_ratings.rating) as review_ratings_count')
))
->addSelect(
DB::raw('AVG(review_ratings_count) as ratings_avg')
)
->where('ratings_avg','>=',$minRating)
;
}
我得到的错误是
Column not found: 1054 Unknown column 'review_ratings_count' in 'field
list'
我发现解决方案比我的代码简单得多,并且使用 AVG(name_of_column) 而不是使用 'AS' 值
->selectRaw('AVG(review_ratings.rating) as overall_rating')
->when($minRating > 0, function ($query) use($minRating)
{
$query->havingRaw('AVG(review_ratings.rating) >= ?', [$minRating]);
})
我有 3 个表:约会、评论、Review_ratings
每个 review_ratings 都有一个评级值。每个评论都有很多 review_ratings 最后,每个约会都有很多评论。
我想做的是计算每个评论review_ratings的平均值,然后计算评论总评分的平均值,看它是否高于特定整数。
例子: 预约 ID:1,有 2 条评论,每条评论有 review_rating 4 和 3 之一,评论评分 2 为 5 和 5。
AVG(review_ratings) 应该 return average(5,5) 和 average(4,3) 之间的平均值是 3.5 然后 AVG(the_first_avg) 应该 return 平均值 (3.5,5) 即 4.25.
我最后测试的查询是:
if($minRating > 0){
$search->join('appointments','appointments.doctor_id','users.id')
->join('reviews','reviews.appointment_id','appointments.id')
->join('review_ratings','review_ratings.review_id','reviews.id')
->addSelect(array('review_ratings.id',
DB::raw('AVG(review_ratings.rating) as review_ratings_count')
))
->addSelect(
DB::raw('AVG(review_ratings_count) as ratings_avg')
)
->where('ratings_avg','>=',$minRating)
;
}
我得到的错误是
Column not found: 1054 Unknown column 'review_ratings_count' in 'field list'
我发现解决方案比我的代码简单得多,并且使用 AVG(name_of_column) 而不是使用 'AS' 值
->selectRaw('AVG(review_ratings.rating) as overall_rating')
->when($minRating > 0, function ($query) use($minRating)
{
$query->havingRaw('AVG(review_ratings.rating) >= ?', [$minRating]);
})