Muszę użyć aliasu w klauzuli WHERE, ale ciągle mówi mi, że jest to nieznana kolumna. Czy jest jakiś sposób na obejście tego problemu? Muszę wybrać rekordy, które mają ocenę wyższą niż x. Ocena jest obliczana jako następujący alias:
sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
źródło
HAVING
wykonywany po pobraniu danych iWHERE
wykonywany wcześniej.Nie wiem, czy to działa w mysql, ale używając sqlserver możesz po prostu opakować to tak:
źródło
To pytanie jest dość stare, a jedna odpowiedź zdobyła już 160 głosów ...
Mimo to chciałbym wyjaśnić: pytanie w rzeczywistości nie dotyczy tego, czy aliasy mogą być używane w
WHERE
klauzuli.jest agregacją. W
WHERE
klauzuli ograniczamy rekordy, które chcemy z tabel, patrząc na ich wartości.sum(reviews.rev_rating)
acount(reviews.rev_id)
jednak nie są wartościami, które znajdziemy w zapisach; są to wartości, które otrzymujemy dopiero po zagregowaniu rekordów.Więc
WHERE
jest to niewłaściwe. PotrzebujemyHAVING
, ponieważ chcemy ograniczyć wiersze wyników po agregacji. To niemożliweani
W związku z tym.
z drugiej strony jest możliwy i zgodny ze standardem SQL. Natomiast
jest możliwe tylko w MySQL. Nie jest to poprawny kod SQL według standardu, ponieważ
SELECT
klauzula ma zostać wykonana poHAVING
. Z dokumentacji MySQL:https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
źródło
Jeśli zapytanie jest statyczne, możesz zdefiniować je jako widok, a następnie możesz użyć tego aliasu w klauzuli where podczas wykonywania zapytania dotyczącego widoku.
źródło
źródło