tipos - sintaxis de update en mysql
¿Puedes usar un alias en la cláusula WHERE en mysql? (4)
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. La calificación se calcula como el siguiente alias:
sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
Esta pregunta es bastante antigua y una respuesta ya ganó 160 votos ...
De todos modos, aclararía esto: la pregunta no es si los nombres de alias pueden usarse 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. 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.
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
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
. De los documentos de MySQL:
Otra extensión de MySQL para 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
No sé si esto funciona en mysql pero usando sqlserver también puedes simplemente envolverlo como sigue:
select * from (
-- your original query
select .. sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
from ...) Foo
where Foo.avg_rating ...
Podría usar una cláusula HAVING, que puede ver los alias, por ejemplo
HAVING avg_rating>5
pero en una cláusula where, necesitarás repetir tu expresión, por ejemplo
WHERE (sum(reviews.rev_rating)/count(reviews.rev_id))>5
¡PERO! 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.
Del manual de MySQL :
No se permite hacer referencia a un alias de columna en una cláusula WHERE, porque el valor de la columna aún no se puede determinar cuando se ejecuta la cláusula WHERE. Consulte la Sección B.1.5.4, "Problemas con alias de columna" .
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.