0

为什么这个查询:

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'?

4

3 回答 3

3

文档中SELECT

不允许在子句中引用列别名WHERE,因为在执行子句时可能尚未确定列值WHERE。请参阅第 C.5.5.4 节,“列别名问题”</a>。

您不能在WHERE子句中使用列别名——您只能使用实际存在于查询中使用的表之一中的列。

您可以包装子查询,以便其结果本身被视为“表”;那么您可以将标准应用于该“表”。

于 2013-06-03T11:14:36.090 回答
0

看起来 iso_code 列来自 ps_address 表,该表仅在您在主查询 (ps_customer) 的选择列表中进行的子查询的上下文中可用。

除此之外,您不需要在主查询中使用此 WHERE 语句,因为您已经在子查询中限制了 iso_code 值。删除它,它应该没问题。

于 2013-06-03T11:15:52.080 回答
0

上面的 SQL 不起作用,因为执行按以下顺序开始

FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY

因此,列的别名将被分配为执行的最后一步,并且 WHERE 发生在它之前。所以 SQL 引擎永远不会知道 iso_code 是什么。

希望这可以帮助。

于 2013-06-03T11:20:02.187 回答