字段列表中的未知列 - 子查询未找到父变量

时间:2014-09-15 03:45:54

标签: mysql subquery

以下查询

SELECT
LocationID,
a.Country,
ISO2,
Region1,
Region2,
Region3,
Area1,
a.City,
a.ZIP,
a.Lat,
a.Lng
FROM AWE_Locations a,
(SELECT PropVidID,
    Latitude,
    Longatude,
SQRT(POW(69.1 * (Latitude - a.Lat), 2) + POW(69.1 * (a.Lng - Longatude) * COS(Latitude / 57.3), 2)) AS Distance FROM AWE_Propvids c
)
as x

WHERE
a.ZIP  LIKE '9021%' and
a.Country = 'US'

HAVING
x.Distance <= '100'

ORDER BY
a.Country,
Region1,
Region2,
a.city,
ISO2,
a.zip

ASC Limit 15

返回错误:

#1054 - Unknown column 'a.Lat' in 'field list'

为什么子查询在这种情况下不能使用父查询中的变量? 我尝试了各种组合试图解决这个问题,但到目前为止还没有运气。

2 个答案:

答案 0 :(得分:0)

您应该考虑选择的以下部分,就像您要定义另一个表(您调用x)一样:

(SELECT PropVidID,
    Latitude,
    Longatude,
SQRT(POW(69.1 * (Latitude - a.Lat), 2) + POW(69.1 * (a.Lng - Longatude) * COS(Latitude / 57.3), 2)) AS Distance FROM AWE_Propvids c
)
as x

定义此表时,应使用a.Lat

修复它的方法是运行“外部”查询,并在AWE_Propvids上运行第二个查询时使用其结果。

它应该类似于:

SELECT 
a.LocationID,
a.Country,
a.ISO2,
a.Region1,
a.Region2,
a.Region3,
a.Area1,
a.City,
a.ZIP,
a.Lat,
a.Lng,
SQRT(POW(69.1 * (Latitude - a.Lat), 2) + POW(69.1 * (a.Lng - Longatude) * COS(Latitude / 57.3), 2)) AS Distance 

FROM AWE_Propvids c,

(SELECT
LocationID,
a.Country,
ISO2,
Region1,
Region2,
Region3,
Area1,
a.City,
a.ZIP,
a.Lat,
a.Lng
FROM AWE_Locations a

WHERE
a.ZIP  LIKE '9021%' and
a.Country = 'US') as a

ORDER BY
a.Country,
a.Region1,
a.Region2,
a.city,
a.ISO2,
a.zip

ASC Limit 15

答案 1 :(得分:0)

问:为什么子查询在这种情况下不能使用父查询中的变量?

答:因为该子查询是内联视图。 MySQL将运行该查询并创建一个临时表,即&#34;派生表&#34; (正如MySQL所称)是外部查询的行源。内联视图查询必须在之前运行引用它的查询。

相关子查询可以在WHERE子句,HAVING子句,IN子句或SELECT列表中使用,但在FROM子句中它不是有效的,作为内联视图查询。