我有以下查询在 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”)
我有以下查询在 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”)
您只能在子句中引用先前与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
括号内没有来源:这就是它无法解决的原因。
以前,逗号运算符 (,) 和 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 混合的语句,所有这些现在都比逗号运算符具有更高的优先级。
答案是将 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