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
È stato utile?

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

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top