Si te encuentras con algo que no entiendes puedes comentarlo y haremos todo lo necesario de ayudarte lo mas rápido que podamos.
Solución:
Solo puede usar alias de columna en las cláusulas GROUP BY, ORDER BY o HAVING.
SQL estándar no le permite hacer referencia a un alias de columna en una cláusula WHERE. Esta restricción se impone porque cuando se ejecuta el código WHERE, es posible que aún no se determine el valor de la columna.
Copiado de la documentación de MySQL
Como se señaló en los comentarios, usar HAVING en su lugar puede hacer el trabajo. Asegúrese de leer también esta pregunta: DÓNDE vs TENER.
Como señaló Víctor, el problema está en el alias. Sin embargo, esto se puede evitar colocando la expresión directamente en la cláusula WHERE x IN y:
SELECT `users`.`first_name`,`users`.`last_name`,`users`.`email`,SUBSTRING(`locations`.`raw`,-6,4) AS `guaranteed_postcode`
FROM `users` LEFT OUTER JOIN `locations`
ON `users`.`id` = `locations`.`user_id`
WHERE SUBSTRING(`locations`.`raw`,-6,4) NOT IN #this is where the fake col is being used
(
SELECT `postcode` FROM `postcodes` WHERE `region` IN
(
'australia'
)
)
Sin embargo, supongo que esto es muy ineficiente, ya que la subconsulta debe ejecutarse para cada fila de la consulta externa.
SQL estándar (o MySQL) no permite el uso de alias de columna en una cláusula WHERE porque
cuando se evalúa la cláusula WHERE, es posible que aún no se haya determinado el valor de la columna.
(de la documentación de MySQL). Lo que puede hacer es calcular el valor de la columna en el DÓNDE cláusula, guarde el valor en una variable y utilícelo en la lista de campos. Por ejemplo, podrías hacer esto:
SELECT `users`.`first_name`, `users`.`last_name`, `users`.`email`,
@postcode AS `guaranteed_postcode`
FROM `users` LEFT OUTER JOIN `locations`
ON `users`.`id` = `locations`.`user_id`
WHERE (@postcode := SUBSTRING(`locations`.`raw`,-6,4)) NOT IN
(
SELECT `postcode` FROM `postcodes` WHERE `region` IN
(
'australia'
)
)
Esto evita repetir la expresión cuando se complica, lo que facilita el mantenimiento del código.
Te mostramos las reseñas y valoraciones de los lectores
Nos encantaría que puedieras compartir este post si te fue útil.