mysql where子句子查询不会在外部查询中重新计算表别名

时间:2015-07-16 03:50:10

标签: mysql subquery

以下查询:

SELECT wp_users.* 
FROM wp_users 
INNER JOIN  wp_usermeta AS mtct  ON ( wp_users.ID = mtct.user_id )  
WHERE not exists (select * from mtct where mtct.meta_key='City')  

给了我

  

错误代码1146:表'.mtct'不存在。

我搜索过类似的问题,但我仍然看不出我做错了什么。我在centos 6.4上使用mysql 5.6.21。

2 个答案:

答案 0 :(得分:0)

您无法在FROM子句中使用表别名,您必须在那里使用真实的表名。

SELECT wp_users.* 
FROM wp_users 
INNER JOIN  wp_usermeta AS mtct  ON ( wp_users.ID = mtct.user_id )  
WHERE not exists (select * 
                  from wp_usermeta AS mtct1
                  where mtct1.meta_key='City') 

这将解决错误,但我不确定它是否会为您提供所需的结果。子查询可能需要与主查询中的一个表相关联。也许这个:

SELECT wp_users.* 
FROM wp_users 
INNER JOIN  wp_usermeta AS mtct  ON ( wp_users.ID = mtct.user_id )  
WHERE not exists (select * 
                  from wp_usermeta AS mtct1
                  where mtct1.meta_key='City'
                    and mtct1.user_id = wp_users.ID) 

但是,与wp_usermeta加入似乎没有任何理由,因为您没有从该表中选择任何内容。这可能只是:

SELECT * 
FROM wp_users 
WHERE not exists (select * 
                  from wp_usermeta AS mtct1
                  where mtct1.meta_key='City'
                    and mtct1.user_id = wp_users.ID) 

这将返回City中没有wp_usermeta的所有用户。

答案 1 :(得分:0)

@Barmar解释了原因,你不能在from子句中使用别名,因为from子句必须有表名,下面的查询可以满足你的目的,如果表格庞大,可能会更快。

SELECT wu.* 
FROM wp_users wu 
LEFT JOIN  wp_usermeta AS mtct  ON wu.ID = mtct.user_id AND mtct.meta_key='City'
WHERE mtct.id IS NULL;