<?php
$query = $this->restaurant->leftJoin('reviews', 'reviews.restaurant_id', '=', 'restaurants.id');
$query = $user_id == null ? $query : $query->where("user_id", $user_id);
$query = $query->select('restaurants.*')
->selectRaw('ROUND(AVG(reviews.rating), 1) as average_rating')
->groupBy('restaurants.id')
->havingRaw('AVG(reviews.rating) >= ?', [$request->from_rating])
->havingRaw('AVG(reviews.rating) <= ?', [$request->to_rating])
->orderByDesc("average_rating")
->paginate(
$this->perPage,
['id', 'name', 'image', 'description', 'filesystem', 'created_at'],
'page',
$request->page
);
return $query;
我的查询如下所示。我有两个表:餐厅和评论。评论表存储restaurant_id
。例如,当我们有10家餐厅,而我们只有1家餐厅有1条评论时,就会出现问题。运行此查询后,仅返回1家餐厅,因为我使用了havingRaw
,它会根据平均评分过滤“餐厅”。因此,如果餐厅没有任何评分,则不会退还该餐厅。
我该如何使所有餐厅仍然返回,但它们的平均评分变为0?
答案 0 :(得分:0)
您可以使用CASE WHEN来填充具有特定条件的mysql。另外,您也可以将“评级”表的数据类型更改为int(5),在这种情况下,所有空值都将显示为0。这样就可以根据您的问题进行操作了。