我在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’)
发布于 2010-05-13 00:22:52
您只能引用以前在ON子句中使用JOIN子句联接的表。
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的源代码:这就是无法解析它的原因。
发布于 2016-01-31 19:27:09
来自MySQL documentation page
以前,逗号运算符(,)和JOIN具有相同的优先级,因此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 as (t1,t2)的隐式分组,SELECT是合法的。现在联接优先,所以ON子句的操作数是t2和t3。由于t1.i1不是这两个操作数中的列,因此结果是'on子句‘错误中的未知列't1.i1’。要允许处理联接,请使用括号显式地对前两个表进行分组,以便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);此更改也适用于将逗号运算符与内部联接、交叉联接、左联接和右联接混合在一起的语句,所有这些语句现在的优先级都高于逗号运算符。
发布于 2018-01-10 22:38:55
答案是将JOIN语句直接放在FROM语句中的表后,因为这是您要连接的表:
SELECT *
FROM email e
LEFT JOIN member m on m.email=e.email,
event_email ee
WHERE ee.email_id = e.email_idhttps://stackoverflow.com/questions/2820724
复制相似问题