Kun je een alias gebruiken in de WHERE-component in mysql?

Ik moet een alias gebruiken in de WHERE-component, maar hij blijft me vertellen dat het een onbekende kolom is. Is er een manier om dit probleem te omzeilen? Ik moet records selecteren met een rating hoger dan x. Beoordeling wordt berekend als de volgende alias:

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

Antwoord 1, autoriteit 100%

Je zou een HAVING-clausule kunnen gebruiken, die kande aliassen zien, bijvoorbeeld

HAVING avg_rating>5

maar in een waar-clausule moet je je uitdrukking herhalen, b.v.

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

MAAR! Niet alle uitdrukkingen zijn toegestaan ​​- het gebruik van een aggregatiefunctie zoals SUM zal niet werken, in welk geval u een HAVING-clausule moet gebruiken.

Uit de MySQL-handleiding:

Het is niet toegestaan ​​om te verwijzen naar a
kolomalias in een WHERE-component,
omdat de kolomwaarde misschien nog niet
worden bepaald wanneer de WHERE-component
is geëxecuteerd. Zie Sectie B.1.5.4,
“Problemen met kolomaliassen”
.


Antwoord 2, autoriteit 14%

Ik weet niet of dit werkt in mysql, maar met sqlserver kun je het ook gewoon inpakken als:

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

Antwoord 3, autoriteit 3%

Deze vraag is vrij oud en één antwoord kreeg al 160 stemmen…

Toch zou ik dit duidelijk willen maken: de vraag is eigenlijk nietof aliasnamen kunnen worden gebruikt in de WHERE-clausule.

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

is een aggregatie. In de WHERE-clausule beperken we de gewenste records uit de tabellen door naar hun waarden te kijken. sum(reviews.rev_rating)en count(reviews.rev_id)zijn echter geen waarden die we in een record vinden; het zijn waarden die we alleen krijgen na het aggregeren van de records.

Dus WHEREis ongepast. We hebben HAVINGnodig, omdat we resultaatrijen na aggregatie willen beperken. Het kan niet

WHERE avg_rating > 10

noch

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

vandaar.

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

aan de andere kant is het mogelijk en voldoet het aan de SQL-standaard. Terwijl

HAVING avg_rating > 10

is alleen mogelijk in MySQL. Het is geen geldige SQL volgens de standaard, aangezien de SELECT-clausule zou moeten worden uitgevoerd na HAVING. Uit de MySQL-documenten:

Een andere MySQL-extensie voor standaard SQL staat verwijzingen in de HAVING-clausule toe naar alias-expressies in de selectielijst.

De MySQL-extensie staat het gebruik van een alias toe in de HAVING-clausule voor de geaggregeerde kolom

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


Antwoord 4

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

Antwoord 5

Als uw zoekopdracht statisch is, kunt u deze definiëren als een weergave en vervolgens kunt u die alias gebruiken in de waar-clausule tijdens het opvragen van de weergave.

Other episodes