[英]LEFT JOIN on SELECT AS alias causing column not found on WHERE statement
我想通过“ user_location”来搜索用户,“ 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'
为什么? 解决办法是什么? 任何答案将不胜感激!
您不能在创建别名的同一查询中的where中使用别名。 因此,您应该执行以下操作:
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子句的同一查询中使用别名。
显而易见且正确的解决方案是在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
不恰当地使人们感到困惑,并可能使优化器感到困惑。
您不能在mysql的Where子句中使用别名。 尝试
SELECT user.*, location.detail as user_location
FROM user
LEFT JOIN location
ON user.id = location.user_id
WHERE location.detail = 'jakarta';
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.