为什么我使用MySQL的子查询别名在'where子句'中获取未知列?

时间:2015-01-16 17:52:11

标签: mysql sql

我在尝试为子查询提供别名然后在Where子句中引用它时收到错误消息:未知列' point_status'在' where子句'

SELECT goals.id, goals.status, 
ifnull((SELECT point_status FROM pts WHERE point_id = ?), goals.status) as point_status
FROM   goals
WHERE  goals.name = ? AND point_status > 1

我不明白为什么它不允许我使用这个别名。是否可以通过不修改Query的功能以某种方式在where子句中使用该别名?

4 个答案:

答案 0 :(得分:4)

您不能在同一个select语句Alias name子句中使用where。您可以将其设为Sub-select并使用alias name中的outer query来过滤记录。

select * from
(SELECT goals.id, goals.status, 
ifnull((SELECT point_status FROM pts WHERE point_id = ?), goals.status) as point_status
FROM   goals
WHERE  goals.name = ?)a
where point_status>1

答案 1 :(得分:2)

  

不允许在WHERE子句中引用列别名,因为在执行WHERE子句时可能尚未确定列值。

这意味着您不能在where子句中使用别名。

尝试将where替换为having

答案 2 :(得分:1)

您可以使用子查询,或者您可以执行以下操作(如果使用子查询不方便):

SELECT goals.id, goals.status
     , IFNULL((SELECT point_status FROM pts WHERE point_id = ?), goals.status) AS point_status
  FROM goals
 WHERE goals.name = ?
   AND IFNULL((SELECT point_status FROM pts WHERE point_id = ?), goals.status) > 1

答案 3 :(得分:0)

其他可能的解决方案:

CREATE VIEW vw_myView
AS
    SELECT goals.id, goals.status, 
ifnull((SELECT point_status FROM pts WHERE point_id = ?), goals.status) as point_status
FROM   goals

然后:

SELECT * from vw_MyView WHERE  goals.name = ? AND point_status > 1