遇到类似 #1054 - Unknown column 'guaranteed_postcode' in 'IN/ALL/ANY subquery'
的 MySQL 查询错误? 当您尝试在 guaranteed_postcode
子句中使用列别名(如下面示例中的 WHERE
)时,通常会发生这种情况。
这是有问题的查询:
<code class="language-sql">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 `guaranteed_postcode` NOT IN ( SELECT `postcode` FROM `postcodes` WHERE `region` IN ('australia') )</code>
根本原因? MySQL 的 WHERE
子句在定义别名的 子句之前处理 。 因此,在 SELECT
子句执行期间尚未识别别名 guaranteed_postcode
。WHERE
子句中不允许使用列别名。 这是源于查询执行顺序的限制。WHERE
SUBSTRING
子句的子查询中:WHERE
<code class="language-sql">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 ( SELECT `postcode` FROM `postcodes` WHERE `region` IN ('australia') )</code>
HAVING
设计用于在 HAVING
聚合之后过滤 ,而不是用于基本行过滤。 这需要重构查询。 请参阅比较 和 WHERE
的其他资源以获取详细说明。HAVING
子句的范围内应用别名计算来直接解决该问题。 除非要执行聚合,否则请避免使用 WHERE
。HAVING
以上是为什么不能在 MySQL WHERE 子句中使用列别名?的详细内容。更多信息请关注PHP中文网其他相关文章!