126 votes

Pouvez-vous utiliser un alias dans la clause WHERE de mysql ?

J'ai besoin d'utiliser un alias dans la clause WHERE, mais il continue à me dire que c'est une colonne inconnue. Existe-t-il un moyen de contourner ce problème ? J'ai besoin de sélectionner les enregistrements qui ont une note supérieure à x. La note est calculée comme l'alias suivant :

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

239voto

Paul Dixon Points 122033

Vous pourriez utiliser une clause HAVING, qui peut voir les alias, par ex.

 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

MAIS ! 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 la Manuel MySQL :

Il n'est pas permis de faire référence à un alias de colonne dans une clause WHERE, car la valeur de la colonne peut ne pas encore être déterminée lorsque la clause WHERE est exécutée. Voir Section B.1.5.4, "Problèmes avec les alias de colonnes" .

33voto

Je ne sais pas si cela fonctionne avec mysql, mais avec sqlserver, vous pouvez aussi l'envelopper comme suit :

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

8voto

Thorsten Kettner Points 6149

Cette question est assez ancienne et une réponse a déjà obtenu 160 votes...

Je tiens tout de même à préciser que la question est en réalité no sur le fait que les noms d'alias peuvent être utilisés dans la section WHERE clause.

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

est une agrégation. Dans le WHERE clause nous limitons les enregistrements que nous voulons des tables en regardant leurs valeurs. sum(reviews.rev_rating) y count(reviews.rev_id) ne sont cependant pas des valeurs que l'on trouve dans un enregistrement ; ce sont des valeurs que l'on obtient seulement après avoir agrégé les enregistrements.

Alors WHERE est inapproprié. Nous avons besoin HAVING car nous voulons restreindre les lignes de résultats après l'agrégation. Cela 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 conforme à la norme SQL. Alors que

HAVING avg_rating > 10

n'est possible que dans MySQL. Il ne s'agit pas d'un SQL valide selon la norme, car l'élément SELECT est censée être exécutée après HAVING . Dans la documentation de MySQL :

Une autre extension de MySQL au SQL standard permet de faire référence dans la clause HAVING à 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

1voto

anson Points 510
SELECT * FROM (SELECT customer_Id AS 'custId', gender, age FROM customer
    WHERE  gender = 'F') AS c
WHERE c.custId = 100;

0voto

alpere Points 384

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

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