J'ai besoin d'utiliser un alias dans la clause WHERE, mais il ne cesse de me dire que c'est une colonne inconnue. Existe-t-il un moyen de contourner ce problème? Je dois sélectionner des enregistrements dont la note est supérieure à x. L'évaluation est calculée comme l'alias suivant:
sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
la source
HAVING
s'exécute après la récupération des données etWHERE
s'exécute avant.Je ne sais pas si cela fonctionne dans mysql mais en utilisant sqlserver, vous pouvez également simplement l'envelopper comme:
la source
Cette question est assez ancienne et une réponse a déjà recueilli 160 voix ...
Je voudrais néanmoins préciser ceci: la question n'est pas en fait de savoir si les noms d'alias peuvent être utilisés dans la
WHERE
clause.est une agrégation. Dans la
WHERE
clause, nous restreignons les enregistrements que nous voulons des tables en examinant leurs valeurs.sum(reviews.rev_rating)
etcount(reviews.rev_id)
, cependant, ne sont pas des valeurs que nous trouvons dans un enregistrement; ce sont des valeurs que nous n'obtenons qu'après agrégation des enregistrements.C'est donc
WHERE
inapproprié. Nous avons besoinHAVING
, car nous voulons restreindre les lignes de résultats après agrégation. Ça ne peut pas êtreni
Par conséquent.
d'autre part est possible et conforme à la norme SQL. Tandis que
n'est possible que dans MySQL. Ce n'est pas du SQL valide selon la norme, car la
SELECT
clause est censée être exécutée aprèsHAVING
. À partir de la documentation MySQL:https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
la source
Si votre requête est statique, vous pouvez la définir comme une vue, puis vous pouvez utiliser cet alias dans la clause where lors de l'interrogation de la vue.
la source
la source