Puoi usare un alias nella clausola WHERE in mysql?
-
03-07-2019 - |
Domanda
Devo usare un alias nella clausola WHERE, ma continua a dirmi che è una colonna sconosciuta. C'è un modo per aggirare questo problema? Devo selezionare i record con un punteggio superiore a x. La valutazione viene calcolata come il seguente alias:
sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
Soluzione
Puoi usare una clausola HAVING, che può vedere gli alias, ad es.
HAVING avg_rating>5
ma in una clausola where dovrai ripetere la tua espressione, ad es.
WHERE (sum(reviews.rev_rating)/count(reviews.rev_id))>5
MA! Non tutte le espressioni saranno consentite - l'utilizzo di una funzione di aggregazione come SUM non funzionerà, nel qual caso dovrai utilizzare una clausola HAVING.
Dal Manuale MySQL :
Non è consentito fare riferimento a a alias di colonna in una clausola WHERE, perché il valore della colonna potrebbe non essere ancora essere determinato quando la clausola WHERE viene eseguito. Vedi Sezione B.1.5.4, & # 8220; Problemi con gli alias di colonna & # 8221; .
Altri suggerimenti
Non so se funziona in mysql ma usando sqlserver puoi anche avvolgerlo come:
select * from (
-- your original query
select .. sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
from ...) Foo
where Foo.avg_rating ...
Questa domanda è piuttosto vecchia e una risposta ha già ottenuto 160 voti ...
Ancora vorrei chiarire questo: la domanda non è in realtà non se i nomi alias possano essere usati nella clausola WHERE
.
sum(reviews.rev_rating) / count(reviews.rev_id) as avg_rating
è un'aggregazione. Nella clausola WHERE
limitiamo i record che vogliamo dalle tabelle osservandone i valori. sum (reviews.rev_rating)
e count (reviews.rev_id)
, tuttavia, non sono valori che troviamo in un record; sono valori che otteniamo solo dopo aver aggregato i record.
Quindi DOVE
è inappropriato. Abbiamo bisogno di HAVING
, poiché vogliamo limitare le righe dei risultati dopo l'aggregazione. Non può essere
WHERE avg_rating > 10
né
WHERE sum(reviews.rev_rating) / count(reviews.rev_id) > 10
dunque.
HAVING sum(reviews.rev_rating) / count(reviews.rev_id) > 10
d'altra parte è possibile ed è conforme allo standard SQL. Mentre
HAVING avg_rating > 10
è possibile solo in MySQL. Non è un codice SQL valido secondo lo standard, poiché la clausola SELECT
dovrebbe essere eseguita dopo HAVING
. Dai documenti MySQL:
Un'altra estensione di MySQL a SQL standard consente riferimenti nella clausola HAVING alle espressioni con alias nell'elenco di selezione.
L'estensione MySQL consente l'uso di un alias nella clausola HAVING per la colonna aggregata
https://dev.mysql.com /doc/refman/5.7/en/group-by-handling.html
Se la query è statica, è possibile definirla come vista, quindi è possibile utilizzare tale alias nella clausola where durante l'interrogazione della vista.