2008-10-14 8 views
90

J'ai besoin d'utiliser un alias dans la clause WHERE, mais il ne cesse de me dire que c'est une colonne inconnue. Y a-t-il un moyen de contourner ce problème? Je dois sélectionner les enregistrements dont la note est supérieure à x. Note est calculée comme l'alias suivant:Pouvez-vous utiliser un alias dans la clause WHERE dans mysql?

sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating 

Répondre

182

Vous pouvez utiliser une clause HAVING, qui peut voir les alias, par exemple

HAVING avg_rating>5 

mais dans une clause where, vous devrez répéter votre expression, par ex.

WHERE (sum(reviews.rev_rating)/count(reviews.rev_id))>5 

BUT! Toutes les expressions ne seront pas autorisées - l'utilisation d'une fonction d'agrégation comme SUM ne fonctionnera pas, auquel cas vous devrez utiliser une clause HAVING.

De l'MySQL Manual:

Il est permis de ne pas faire référence à un alias de colonne dans une clause WHERE, parce que la valeur de la colonne peut-être pas encore déterminer si la clause WHERE est exécutée. Voir Section B.1.5.4, “Problems with Column Aliases”.

+1

Si je répète l'expression, il me dit: « utilisation invalide de la fonction de groupe » –

+3

Avez reformulé pour rendre plus claires les fonctions d'agrégation interditesd –

+0

Belle explication, esp. le "mais dans une clause where ... repeat .." partie – th3an0maly

28

J'sais si cela fonctionne dans une base MySQL, mais en utilisant SQL Server, vous pouvez aussi tout simplement envelopper comme:

select * from (
    -- your original query 
    select .. sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating 
    from ...) Foo 
where Foo.avg_rating ... 
+2

Oui, ça marche aussi avec MySQL. – fracz

0

Il votre requête est statique, vous pouvez le définir comme une vue, vous pouvez utiliser cet alias dans la clause where lors de l'interrogation de la vue.

2

Cette question est tout à fait vieux et une réponse déjà gagné 160 votes ...

Cependant, je Feraient clairement: La question est en fait pas de savoir si les noms d'alias peuvent être utilisés dans la clause WHERE.

sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating 

est une agrégation. Dans la clause WHERE, nous limitons les enregistrements que nous voulons des tables en examinant leurs valeurs. sum(reviews.rev_rating) et count(reviews.rev_id), cependant, ne sont pas des valeurs que nous trouvons dans un enregistrement; ce sont des valeurs que nous obtenons seulement après avoir agrégé les enregistrements.

Donc, WHERE est inapproprié. Nous avons besoin de HAVING, car nous voulons restreindre les lignes de résultat après l'agrégation. Il ne peut pas être

WHERE avg_rating > 10 

ni

WHERE sum(reviews.rev_rating)/count(reviews.rev_id) > 10 

donc.

HAVING sum(reviews.rev_rating)/count(reviews.rev_id) > 10 

d'autre part est possible et est conforme à la norme SQL. Considérant que

HAVING avg_rating > 10 

est seulement possible dans MySQL.Ce n'est pas un SQL valide selon la norme, puisque la clause SELECT est censée être exécutée après HAVING. À partir des documents MySQL:

Une autre extension MySQL au langage SQL standard permet aux références dans la clause HAVING d'avoir des expressions aliasées dans la liste de sélection.

L'extension MySQL permet l'utilisation d'un alias dans la clause HAVING pour la colonne agrégée

https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

Questions connexes