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
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top