SELECT AS别名上的LEFT JOIN导致在WHERE语句中找不到列

时间:2017-04-15 19:10:22

标签: mysql sql

我想通过' user_location'来搜索用户这是location.detail的别名 我做了以下查询:

SELECT user.*, location.detail as user_location 
FROM user 
LEFT JOIN location
ON user.id = location.user_id
WHERE user_location = 'jakarta';

它产生的错误说,

Column not found: 1054 Unknown column 'user_location' in 'where clause' 

为什么?解决办法是什么? 任何答案都将受到高度赞赏!

3 个答案:

答案 0 :(得分:3)

您无法在创建它的同一查询中的位置使用别名。所以你应该这样做:

SELECT user.*, location.detail as user_location 
  FROM user 
        LEFT JOIN location
          ON user.id = location.user_id
 WHERE location.detail = 'jakarta';

如果您仍想使用该列,则必须将其包装在子查询中:

select * from
(
SELECT user.*, location.detail as user_location 
  FROM user 
        LEFT JOIN location
          ON user.id = location.user_id
) a
where user_location = 'jakarta';

正如@ spencer7593所提到的,你可以在HAVING子句的同一个查询中使用别名。

答案 1 :(得分:2)

明显而正确的解决方案是重复WHERE子句中的表达式。有时,表达式更复杂(想想距离计算)。 MySQL有一个SQL扩展,允许您为此目的使用HAVING

SELECT u.*, l.detail as user_location 
FROM user u LEFT JOIN
     location l
     ON u.id = l.user_id
HAVING user_location = 'jakarta';

我实际上并没有为这个特定的查询推荐它(毕竟,“user_location”输入的时间比“l.detail”更长)。但在某些情况下,这可能很方便。

比这些注意事项更重要的是您的查询实际上是INNER JOIN。你应该这样指定:

SELECT u.*, l.detail as user_location 
FROM user u INNER JOIN
     location l
     ON u.id = l.user_id
WHERE l.detail = 'jakarta';

过滤条件过滤掉所有不匹配的行。使用LEFT JOIN会不恰当地混淆人们并可能会使优化程序混淆。

答案 2 :(得分:1)

您不能在mysql的Where子句中使用别名。尝试

SELECT user.*, location.detail as user_location 
FROM user 
LEFT JOIN location
ON user.id = location.user_id
WHERE location.detail = 'jakarta';