13

我有以下查询在 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 子句”中的未知列“e.email”)

4

3 回答 3

18

您只能在子句中引用先前与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括号内没有来源:这就是它无法解决的原因。

于 2010-05-12T16:22:51.767 回答
5

来自MySQL 文档页面

以前,逗号运算符 (,) 和 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 不是任一操作数中的列,所以结果是 Unknown column 't1.i1' in 'on Clause' 错误。要允许处理连接,请将前两个表用括号显式分组,以便 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 混合的语句,所有这些现在都比逗号运算符具有更高的优先级。

于 2016-01-31T11:27:09.010 回答
3

答案是将 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
于 2018-01-10T14:38:55.310 回答