2 votes

SQL HAVING ne peut pas trouver la colonne <unknown column>

return $this
    ->restaurant
    ->select('restaurants.*')
    ->selectRaw('COALESCE(ROUND(AVG(reviews.rating),1), 0) as average_rating')
    ->leftJoin('reviews', 'reviews.restaurant_id', '=', 'restaurants.id')
    ->when($user_id, function($query, $user_id){
        $query->where("restaurants.user_id", $user_id);
    })
    ->groupBy('restaurants.id')
    ->when($request->from_rating, function($query, $from_rating){
        $query->having('average_rating', '>=', $from_rating);
    })
    ->when($request->to_rating, function($query, $to_rating){
        $query->having('average_rating', '<=', $to_rating);
    })->orderByDesc("average_rating")
    ->paginate(
        $this->perPage, 
        ['id', 'name', 'image', 'description', 'filesystem', 'created_at'], 
        'page', 
        $request->page
    );

C'est la requête à laquelle je suis confronté. Enfin. J'ai réussi à la faire fonctionner, mais maintenant le problème est de regarder la ligne suivante,

$query->having('average_rating', '>=', $from_rating);

Cela provoque une erreur : colonne inconnue average_rating. Je ne sais pas pourquoi. J'ai cette colonne dans le select ci-dessus.

J'ai également transformé ceci en une instruction SQL en utilisant la fonction toSql().

Résultat :

select 
    `restaurants`.*, 
    COALESCE(ROUND(AVG(reviews.rating),1), 0) as average_rating 
from 
    `restaurants` 
     left join `reviews` on `reviews`.`restaurant_id` = `restaurants`.`id` 
group by `restaurants`.`id` 
having `average_rating` >= ? and `average_rating` <= ? 
order by `average_rating` desc

1voto

GMB Points 188687

Les alias de colonne définis dans la clause SELECT ne sont pas autorisés dans la clause HAVING. Cela est dû à l'ordre dans lequel le SGBDR évalue les différentes parties de la requête : la clause HAVING est évaluée avant la clause SELECT, contrairement, par exemple, à la clause ORDER BY, qui est traitée plus tard (et accepte donc les alias de colonnes)

Vous devriez modifier cette partie de votre requête :

$query->having('average_rating', '>=', $from_rating);

À :

$query->having('COALESCE(ROUND(AVG(reviews.rating),1), 0)', '>=', $from_rating);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X