Necesito usar un alias en la cláusula WHERE, pero me sigue diciendo que es una columna desconocida. ¿Hay alguna forma de solucionar este problema? Necesito seleccionar registros que tengan una calificación superior a x. La calificación se calcula con el siguiente alias:
sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
fuente
HAVING
ejecuta después de que se obtienen los datos y seWHERE
ejecuta antes.No sé si esto funciona en mysql, pero usando sqlserver también puede envolverlo como:
fuente
Esta pregunta es bastante antigua y una respuesta ya obtuvo 160 votos ...
Aún así, dejaría esto en claro: la pregunta en realidad no es si los nombres de alias se pueden usar en la
WHERE
cláusula.es una agregación. En la
WHERE
cláusula restringimos los registros que queremos de las tablas mirando sus valores.sum(reviews.rev_rating)
ycount(reviews.rev_id)
, sin embargo, no son valores que encontremos en un registro; son valores que solo obtenemos después de agregar los registros.Entonces
WHERE
es inapropiado. NecesitamosHAVING
, ya que queremos restringir las filas de resultados después de la agregación. No puede serni
por lo tanto.
por otro lado es posible y cumple con el estándar SQL. Mientras
solo es posible en MySQL. No es SQL válido de acuerdo con el estándar, ya
SELECT
que se supone que la cláusula se ejecuta despuésHAVING
. De los documentos de MySQL:https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
fuente
Si su consulta es estática, puede definirla como una vista, luego puede usar ese alias en la cláusula where mientras consulta la vista.
fuente
fuente