2008-10-14 55 views
90

Necesito usar un alias en la cláusula WHERE, pero me sigue diciendo que es una columna desconocida. ¿Hay alguna forma de evitar este problema? Necesito seleccionar registros que tengan una clasificación más alta que x. Calificación se calcula como el siguiente alias:¿Se puede usar un alias en la cláusula WHERE en mysql?

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

Respuesta

182

se puede utilizar una cláusula HAVING, que puede ver los alias, por ejemplo,

HAVING avg_rating>5 

pero en una cláusula where tendrá que repetir su expresión, p.

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

BUT! No todas las expresiones serán permitidas, usando una función de agregación como SUM no funcionará, en cuyo caso necesitarás usar una cláusula HAVING.

Desde el MySQL Manual:

que no sean deducibles para referirse a un alias de columna en una cláusula WHERE, debido a que el valor de la columna podría no ser todavía determinado cuando se ejecuta la cláusula . Ver Section B.1.5.4, “Problems with Column Aliases”.

+1

Si repito la expresión, me dice: "uso inválido de la función de grupo" –

+3

Tener redactado de nuevo para que sea más claro las funciones de agregación no permitidas –

+0

Buena explicación, esp. la parte "pero en una cláusula where ... repeat ..." – th3an0maly

28

No sé si esto funciona en MySQL pero utilizando sqlserver También se puede simplemente envolverlo como:

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

Sí, también funciona en MySQL. – fracz

0

Es su consulta es estática, se puede definir como una vista a continuación, puede utilizar ese alias en la cláusula where al consultar la vista.

2

Esta pregunta es bastante antiguo y una respuesta ya ganó 160 votos ...

Aún así me gustaría hacer esto en claro: La pregunta es, en realidad no acerca de si los nombres de alias se pueden utilizar en la cláusula WHERE.

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

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

WHERE no es adecuado. 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 SQL válido según el estándar, ya que se supone que la cláusula SELECT se ejecuta después de HAVING. A partir de la documentación de MySQL:

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

La extensión de 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

Cuestiones relacionadas