我在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')
答案 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)
以前,逗号运算符(,)和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