Frage

Ich brauche für die Verwendung eines alias in der WHERE-Klausel, aber Es sagt mir, dass es eine unbekannte Spalte.Gibt es eine Möglichkeit, um dieses Problem?Ich brauche, um Datensätze auszuwählen, haben eine Bewertung höher als x ist.Bewertung errechnet sich aus der folgenden alias:

sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
War es hilfreich?

Lösung

Sie könnte verwenden Sie eine HAVING-Klausel, die können sehen Sie die Aliase, wie z.B.

 HAVING avg_rating>5

aber in einer where-Klausel, die Sie benötigen zu wiederholen, die Ihren Ausdruck, z.B.

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

ABER!Nicht alle Ausdrücke werden erlaubt - mit einer Aggregatfunktion wie SUM wird nicht funktionieren, in diesem Fall müssen Sie zu einer HAVING-Klausel.

Aus der MySQL-Handbuch:

Es ist nicht zulässig, beziehen sich auf eine Spalte alias WHERE-Klausel, da der Wert der Spalte möglicherweise noch nicht bestimmt werden, wenn die WHERE-Klausel ausgeführt wird.Finden Abschnitt B. 1.5.4, "Probleme mit den Spalten-Aliase".

Andere Tipps

Keine Ahnung, ob dies funktioniert in mysql, aber mit SQL Server können Sie auch nur wickeln Sie es mögen:

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

Diese Frage ist ziemlich alt, und eine Antwort bereits gewonnen 160 Stimmen...

Trotzdem würde ich dies deutlich machen:Die Frage ist eigentlich nicht darüber, ob die alias-Namen verwendet werden können WHERE Klausel.

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

eine aggregation.In der WHERE Klausel beschränken wir den Aufzeichnungen, die wir wollen, aus den Tabellen durch einen Blick auf Ihre Werte. sum(reviews.rev_rating) und count(reviews.rev_id), allerdings werden keine Werte finden wir in einer Aufzeichnung;Sie sind Werte, die wir erst bekommen nach der Aggregation der Datensätze.

So WHERE unangemessen ist.Wir brauchen HAVING, als wir beschränken möchten Ergebniszeilen nach der aggregation.Es kann nicht sein,

WHERE avg_rating > 10

noch

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

daher.

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

auf der anderen Seite ist möglich und entspricht dem SQL-standard.In der Erwägung, dass

HAVING avg_rating > 10

ist nur möglich, in MySQL.Es ist kein Gültiger SQL nach dem standard, wie die SELECT Klausel soll, die ausgeführt werden, nachdem HAVING.Aus der MySQL-Dokumentation:

Eine andere MySQL-Erweiterung zum SQL-standard erlaubt Referenzen in der HAVING-Klausel auf alias Ausdrücke in der select-Liste.

Die MySQL-Erweiterung ermöglicht die Verwendung eines alias in der HAVING-Klausel für die aggregierte Spalte

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

Wenn Ihre Abfrage ist statische, Sie können definieren es als eine Ansicht, dann können Sie das alias in der where-Klausel, während einer Abfrage der view.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top