我有以下查詢在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」 )
我有以下查詢在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」 )
您只能引用之前與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
引號裏面:這就是爲什麼它無法解決。
此前,逗號(,)和兩個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,所有這些現在已經比逗號運算符優先級越高。
答案應該是放置在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
通過報價,你的意思括號?在第一個查詢中,我不明白你的解釋。你指的是哪一條款?你能重新表達嗎?謝謝 – Neil 2010-05-12 16:37:13