Können Sie einen alias in der WHERE-Klausel in mysql?
-
03-07-2019 - |
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
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.