为什么这个查询:
SELECT SQL_CALC_FOUND_ROWS,a.*,(SELECT cy.iso_code
FROM ps_address AS addr, ps_country AS cy
WHERE addr.id_customer=a.id_customer
AND addr.id_country=cy.id_country) iso_code
FROM `ps_customer` a
WHERE iso_code='IT'
ORDER BY a.`id_customer` ASC
LIMIT 0,50
回复我:#1054 - Unknown column 'iso_code' in 'where clause'?
答案 0 :(得分:3)
来自the documentation on SELECT
:
不允许在
WHERE
子句中引用列别名,因为在执行WHERE
子句时可能尚未确定列值。请参阅Section C.5.5.4, “Problems with Column Aliases”。
您不能在WHERE
子句中使用列别名 - 您只能使用查询中使用的其中一个表中实际存在的列。
你可以wrap the subquery so that its result is treated as a "table" in its own right;那么你可以将标准应用于那个“表”。
答案 1 :(得分:0)
看起来iso_code列来自ps_address表,该表仅在您在主查询(ps_customer)的选择列表中创建的子查询的上下文中可用。
除此之外,您在主查询中不需要此WHERE语句,因为您已经限制了子查询中的iso_code值。删除它,它应该没问题。
答案 2 :(得分:0)
上述SQL无效,因为执行按以下顺序开始
FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY
这样,列的别名将被指定为执行中的第二个最后一步,并且WHERE在它之前发生。所以SQL引擎永远不会知道iso_code在这里。
希望这有帮助。