2010-05-12 45 views
10

我有以下查詢在MySQL 4.1的工作,但不會在5.0:MySQL的5左加入未知列

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

錯誤: 1054(未知列「的條款」在「e.email」 )

回答

14

您只能引用之前與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引號裏面:這就是爲什麼它無法解決。

+3

通過報價,你的意思括號?在第一個查詢中,我不明白你的解釋。你指的是哪一條款?你能重新表達嗎?謝謝 – Neil 2010-05-12 16:37:13

1

MySQL documentation page

此前,逗號(,)和兩個JOIN具有相同的優先級,所以聯接表達式T1,T2 T3 JOIN被解釋爲((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); 

以前,SELECT是合法由於t1的隱式分組,T2爲(T1,T2)。現在JOIN優先,所以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); 

這種變化也適用於語句有內混合逗號操作JOIN,CROSS JOIN,LEFT JOIN和RIGHT JOIN,所有這些現在已經比逗號運算符優先級越高。

0

答案應該是放置在FROM語句中的表後直接JOIN語句,因爲那是表中要加入的:

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