você pode usar um alias na cláusula WHERE no mysql?
-
03-07-2019 - |
Pergunta
Eu preciso usar um alias na cláusula WHERE, mas ele continua me dizendo que sua uma coluna desconhecida. Existe alguma maneira de contornar este problema? Eu preciso selecionar registros que tenham uma classificação superior a x. Rating é calculado como o alias a seguir:
sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
Solução
Você pode usar uma cláusula HAVING, que pode ver os aliases, por exemplo.
HAVING avg_rating>5
mas em uma cláusula onde você precisará repetir a sua expressão, por exemplo,
WHERE (sum(reviews.rev_rating)/count(reviews.rev_id))>5
MAS! será permitido nem todas as expressões -. usando uma função de agregação como SUM não vai funcionar, caso em que você vai precisar usar uma cláusula HAVING
A partir da MySQL manual :
Não é permitido para se referir a um alias na cláusula ONDE, porque o valor força da coluna ainda não ser determinado quando a cláusula ONDE É executado. Consulte Secção B.1.5.4, “Problemas com alias” .
Outras dicas
Não sei se isso funciona em mysql, mas usando sqlserver você também pode simplesmente envolvê-la como:
select * from (
-- your original query
select .. sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
from ...) Foo
where Foo.avg_rating ...
Esta questão é bastante antiga e uma resposta já ganhou 160 votos ...
Ainda que eu faria isso claro:. A questão é realmente não sobre se nomes de alias pode ser usado na cláusula WHERE
sum(reviews.rev_rating) / count(reviews.rev_id) as avg_rating
é uma agregação. Na cláusula WHERE
restringimos registros que queremos das tabelas vendo os seus valores. sum(reviews.rev_rating)
e count(reviews.rev_id)
, no entanto, não são valores que encontramos em um registro; são valores que só começa depois agregando os registros.
Assim WHERE
é impróprio. Precisamos HAVING
, como queremos restringir as linhas de resultados após a totalização. Não pode ser
WHERE avg_rating > 10
nem
WHERE sum(reviews.rev_rating) / count(reviews.rev_id) > 10
daí.
HAVING sum(reviews.rev_rating) / count(reviews.rev_id) > 10
Por outro lado é possível e compatível com o padrão SQL. Considerando
HAVING avg_rating > 10
só é possível no MySQL. Não é SQL válido de acordo com o padrão, como a cláusula SELECT
é suposto começar executado após HAVING
. De docs MySQL:
Outra extensão do MySQL ao SQL padrão permite referências na cláusula HAVING para expressões alias na lista de seleção.
A extensão MySQL permite a utilização de um alias na cláusula HAVING para a coluna agregados
https://dev.mysql.com /doc/refman/5.7/en/group-by-handling.html
Se a consulta é estático, você pode defini-lo como uma visão, então você pode usar esse alias na cláusula onde ao consultar a vista.