MySQL 5离开加入未知列

时间:2010-05-12 16:19:20

标签: mysql left-join mysql-error-1054

我在mysql 4.1中使用了以下查询,但在5.0中没有:

SELECT * FROM email e, event_email ee 
LEFT JOIN member m on m.email=e.email 
WHERE ee.email_id = e.email_id

错误: 1054('on clause'中的未知栏'e.email')

3 个答案:

答案 0 :(得分:16)

您只能引用先前使用JOIN子句中的ON子句加入的表。

SELECT  *
FROM    email e
JOIN    event_email ee 
ON      ee.email_id = e.email_id
LEFT JOIN
        member m
ON      m.email = e.email 

如果我在原始查询中的ANSI JOINS附近加上引号,可以更好地说明这一点:

SELECT  *
FROM    email e,
        (
        event_email ee
        LEFT JOIN
                member m
        ON      m.email = e.email 
        )
WHERE   ee.email_id = e.email_id

正如您所看到的,引号内部e.email没有来源:这就是无法解决的原因。

答案 1 :(得分:3)

来自MySQL documentation page

以前,逗号运算符(,)和JOIN都具有相同的优先级,因此连接表达式t1,t2 JOIN t3被解释为((t1,t2)JOIN t3)。现在JOIN具有更高的优先级,因此表达式被解释为(t1,(t2 JOIN t3))。此更改会影响使用ON子句的语句,因为该子句只能引用连接操作数中的列,并且优先级的更改会更改对这些操作数的解释。

示例:

CREATE TABLE t1 (i1 INT, j1 INT);
CREATE TABLE t2 (i2 INT, j2 INT);
CREATE TABLE t3 (i3 INT, j3 INT);

SELECT * FROM t1, t2 JOIN t3 ON (t1.i1 = t3.i3);

以前,由于t1,t2的隐式分组为(t1,t2),SELECT是合法的。现在JOIN优先,因此ON子句的操作数是t2和t3。因为t1.i1不是任何一个操作数中的列,所以结果是一个未知列&t; t1.i1'在' on条款'错误。要允许处理连接,请使用括号显式地对前两个表进行分组,以便ON子句的操作数为(t1,t2)和t3:

SELECT * FROM (t1, t2) JOIN t3 ON (t1.i1 = t3.i3);

或者,避免使用逗号运算符并改为使用JOIN:

SELECT * FROM t1 JOIN t2 JOIN t3 ON (t1.i1 = t3.i3);

此更改也适用于将逗号运算符与INNER JOIN,CROSS JOIN,LEFT JOIN和RIGHT JOIN混合的语句,所有这些语句现在都具有比逗号运算符更高的优先级。

答案 2 :(得分:1)

答案是将JOIN语句直接放在FROM语句中的表之后,因为这是您要加入的表:

SELECT * 
FROM email e 
LEFT JOIN member m on m.email=e.email, 
event_email ee 
WHERE ee.email_id = e.email_id