2014-08-29 59 views
1

我有这样的代码..使用字段的名称是以中 'AS' 一个JOIN

SELECT u.*, COALESCE(c2.name,u.state) AS real_state, c.name AS real_country, bc.alpha3 AS country_iso FROM gimko_v2.users AS u 
     INNER JOIN gimko_v2.countries AS c ON u.country=c.id 
     LEFT JOIN gimko_v2.countries AS c2 ON u.state=c2.id 
     LEFT JOIN gimko_blesta.countries AS bc ON c.country_iso_code=bc.alpha2 
     LEFT JOIN gimko_blesta.states AS bs ON bc.alpha2=bs.country_alpha2 AND real_state=bs.name 
     WHERE u.blesta_id=0; 

在这方面的问题,喜欢:

COALESCE(c2.name,u.state) AS real_state 

LEFT JOIN gimko_blesta.states AS bs ON bc.alpha2=bs.country_alpha2 AND real_state=bs.name 

我得到这个错误:

Error Code: 1054 
Unknown column 'real_state' in 'on clause' 

如何在JOIN中使用COALESCE(c2.name,u.state)的结果?

谢谢!

+1

通过使用表达式而不是别名。 'from'子句在'select'之前被评估,所以它不知道'select'中定义的别名。 – 2014-08-29 15:44:37

回答

2

是否gimko_blesta.states甚至需要在源表?它的列没有列在选择列表/标准中,并且它以LEFT JOIN加入,因此似乎不是必要的。

在任何情况下,你需要使它成为一个派生表第一,并加入到gimko_blesta.states派生表,或者只是在表达式中使用的JOIN,像COALESCE(c2.name,u.state) = bs.name,如下:

SELECT u.*, COALESCE(c2.name,u.state) AS real_state, c.name AS real_country, bc.alpha3 AS country_iso 
FROM gimko_v2.users AS u 
     INNER JOIN gimko_v2.countries AS c ON u.country=c.id 
     LEFT JOIN gimko_v2.countries AS c2 ON u.state=c2.id 
     LEFT JOIN gimko_blesta.countries AS bc ON c.country_iso_code=bc.alpha2 
     LEFT JOIN gimko_blesta.states AS bs ON bc.alpha2=bs.country_alpha2 AND COALESCE(c2.name,u.state) = bs.name 
     WHERE u.blesta_id=0; 
+0

是的,我发布这个问题后,我在列表中添加了一个列。 :) – Brett 2014-08-29 16:00:53

2

您不能使用虚拟别名在查询同一水平,你可能需要重复整个表达式或使用子选择访问你的父查询

SELECT * FROM (
SELECT u.*, 
COALESCE(c2.name,u.state) AS real_state, 
c.name AS real_country, 
bc.alpha3 AS country_iso , 
bc.alpha2 
FROM gimko_v2.users AS u 
     INNER JOIN gimko_v2.countries AS c ON u.country=c.id 
     LEFT JOIN gimko_v2.countries AS c2 ON u.state=c2.id 
     LEFT JOIN gimko_blesta.countries AS bc ON c.country_iso_code=bc.alpha2 
) t 
LEFT JOIN gimko_blesta.states AS bs ON t.alpha2=bs.country_alpha2 AND t.real_state=bs.name 
WHERE t.blesta_id=0; 

另外在子选择要选择所有将在外使用的需要的列加入了父查询像你的情况我已经在内部查询选择bc.alpha2因为与states需要此列加入

相关问题