Pregunta

Necesito usar un alias en la cláusula WHERE, pero me sigue diciendo que es una columna desconocida. ¿Hay alguna manera de evitar este problema? Necesito seleccionar registros que tengan una calificación superior a x. La calificación se calcula como el siguiente alias:

sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
¿Fue útil?

Solución

Puedes usar una cláusula HAVING, que can puede ver los alias, por ejemplo

 HAVING avg_rating>5

pero en una cláusula donde tendrá que repetir su expresión, por ejemplo,

 WHERE (sum(reviews.rev_rating)/count(reviews.rev_id))>5

PERO! No se permitirán todas las expresiones: usar una función de agregación como SUM no funcionará, en cuyo caso deberá usar una cláusula HAVING.

Desde el Manual de MySQL :

  

No está permitido referirse a un   alias de columna en una cláusula WHERE,   porque el valor de la columna aún no puede   ser determinado cuando la cláusula WHERE   es ejecutado. Consulte Sección B.1.5.4,   & # 8220; Problemas con los alias de columna & # 8221; .

Otros consejos

No sé si esto funciona en mysql pero utilizando sqlserver, también puedes envolverlo así:

select * from (
  -- your original query
  select .. sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating 
  from ...) Foo
where Foo.avg_rating ...

Esta pregunta es bastante antigua y una respuesta ya obtuvo 160 votos ...

Aún así, lo aclararía: la pregunta es en realidad no sobre si los nombres de alias se pueden usar en la cláusula WHERE .

sum(reviews.rev_rating) / count(reviews.rev_id) as avg_rating

es una agregación. En la cláusula WHERE restringimos los registros que queremos de las tablas al observar sus valores. Sin embargo, sum (reviews.rev_rating) y count (reviews.rev_id) no son valores que encontramos en un registro; son valores que solo obtenemos después de agregar los registros.

Entonces WHERE es inapropiado. Necesitamos HAVING , ya que queremos restringir las filas de resultados después de la agregación. No puede ser

WHERE avg_rating > 10

ni

WHERE sum(reviews.rev_rating) / count(reviews.rev_id) > 10

por lo tanto.

HAVING sum(reviews.rev_rating) / count(reviews.rev_id) > 10

por otro lado es posible y cumple con el estándar SQL. Mientras que

HAVING avg_rating > 10

solo es posible en MySQL. No es un SQL válido según el estándar, ya que se supone que la cláusula SELECT se ejecute después de HAVING . De los documentos de MySQL:

  

Otra extensión de MySQL a SQL estándar permite referencias en la cláusula HAVING a expresiones con alias en la lista de selección.

     

La extensión MySQL permite el uso de un alias en la cláusula HAVING para la columna agregada

https://dev.mysql.com /doc/refman/5.7/en/group-by-handling.html

Si su consulta es estática, puede definirla como una vista y luego puede usar ese alias en la cláusula where mientras consulta la vista.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top