Saltar al contenido

¿Puedes usar un alias en la cláusula WHERE en mysql?

Si encuentras algo que no entiendes puedes dejarlo en la sección de comentarios y trataremos de ayudarte rápidamente.

Solución:

Podría usar una cláusula HAVING, que poder ver los alias, por ejemplo

 HAVING avg_rating>5

pero en una cláusula where necesitará repetir su expresión, por ejemplo

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

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

Del manual de MySQL:

No está permitido hacer referencia a un alias de columna en una cláusula WHERE, porque es posible que el valor de la columna aún no se haya determinado cuando se ejecuta la cláusula WHERE. Consulte la Sección B.1.5.4, “Problemas con los alias de columna”.

No sé si esto funciona en mysql, pero usando 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í, dejaría esto claro: la pregunta es en realidad no sobre si los nombres de alias se pueden utilizar en el WHERE cláusula.

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

es una agregación. En el WHERE restringimos los registros que queremos de las tablas mirando 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 Nosotros 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 eso.

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 el SELECT se supone que la cláusula 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 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

Reseñas y valoraciones del tutorial

Recuerda que tienes la capacidad de decir si te fue preciso.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *