MySQL:LEFT JOIN + Alias

时间:2017-11-30 13:55:40

标签: mysql

考虑表table1及其对应的查找表table2

`table1`
a b
1 11
2 22
3 33
4 44
5 55

`table2`
b c
11 111
22 222
33 333
44 444
55 555

您可以使用以下查询在table1table2之间执行查找:

SELECT `table1`.`a`, `table1`.`b`, `table2`.`c`
FROM `table1`
LEFT JOIN `table2`
ON `table1`.`b` = `table2`.`b`

哪会正确提示结果:

a b c
1 11 111
2 22 222
3 33 333
4 44 444
5 55 555

问题
现在,假设由于某种原因,您需要列b的别名(例如:某些函数计算)。本能地,您可能会尝试执行以下查询:

SELECT `table1`.`a`, ABS(`table1`.`b`) as tb, `table2`.`c`
FROM `table1`
LEFT JOIN `table2`
ON tb = `table2`.`b`

然而,MySQL会说:

#1054 - Unknown column 'tb' in 'on clause' 

问题
上面的查询有什么问题?如何纠正?
如何在LEFT JOIN查询中使用别名?

1 个答案:

答案 0 :(得分:2)

在同一级别的查询中,您不能在ON子句中使用列别名,但是您可以在ON子句中使用别名的完整表达式

SELECT `table1`.`a`, ABS(`table1`.`b`) as tb, `table2`.`c`
FROM `table1`
LEFT JOIN `table2`
ON ABS(`table1`.`b`) = `table2`.`b` 

编辑以在ON子句中使用别名,您可以在外部查询中使用它们,如

SELECT a.`a`, a.tb, b.`c`
FROM(
    SELECT `a`, ABS(`b`) as tb FROM `table1`
) a
LEFT JOIN `table2` as b
ON a.tb = b.`b`