2010-05-12 4 views
10

ich die folgende Abfrage in MySQL arbeiten musste 4.1, aber nicht in 5.0:MySQL 5 links unbekannt Joinspalte

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

Der Fehler: 1054 (Unknown column 'e.email' in 'on-Klausel')

Antwort

14

Sie können nur die Tabellen referenzieren, die zuvor mit der JOIN-Klausel in der ON-Klausel verknüpft wurden.

SELECT * 
FROM email e 
JOIN event_email ee 
ON  ee.email_id = e.email_id 
LEFT JOIN 
     member m 
ON  m.email = e.email 

Dies kann besser veranschaulicht werden, wenn ich die Anführungszeichen um den ANSI JOINS in Ihrer ursprünglichen Abfrage setzen:

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

Wie Sie sehen können, gibt es keine Quelle für e.email innerhalb der Anführungszeichen: das ist, warum es konnte nicht gelöst werden.

+3

Durch Zitate, tun Sie Klammern bedeuten? In der ersten Abfrage verstehe ich deine Erklärung nicht. Auf welche Klausel beziehen Sie sich? Kannst du es neu formulieren? Vielen Dank – Neil

1

Von MySQL documentation page

Zuvor hatte die Komma-Operator (,) und JOIN hatten beide die gleiche Priorität, so der Ausdruck t1 verbinden, t2 JOIN t3 wurde interpretiert als ((T1, T2) JOIN t3). Jetzt hat JOIN eine höhere Priorität, daher wird der Ausdruck interpretiert als (t1, (t2 JOIN t3)). Diese Änderung wirkt sich auf Anweisungen aus, die eine ON-Klausel verwenden, da sich diese Klausel nur auf Spalten in den Operanden des Joins beziehen kann, und die Änderung der Priorität ändert die Interpretation dessen, was diese Operanden sind.

Beispiel:

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); 

Zuvor war die SELECT Recht aufgrund der impliziten Gruppierung von T1, T2 als (T1, T2). Jetzt hat der JOIN Vorrang, also sind die Operanden für die ON-Klausel t2 und t3. Da t1.i1 keine Spalte in einem der Operanden ist, ist das Ergebnis eine unbekannte Spalte 't1.i1' in 'on clause' Fehler. Damit die Verbindung verarbeitet werden, gruppieren Sie die ersten beiden Tabellen explizit mit Klammern, so dass die Operanden für die ON-Klausel sind (T1, T2) und t3:

SELECT * FROM (t1, t2) JOIN t3 ON (t1.i1 = t3.i3); 

Alternativ vermeiden die Verwendung des Komma-Operator und stattdessen verwenden JOIN:

SELECT * FROM t1 JOIN t2 JOIN t3 ON (t1.i1 = t3.i3); 

Diese Änderung gilt auch für Anweisungen, die den Komma-Operator mit INNER JOIN mischen, CROSS JOIN LEFT JOIN und RIGHT JOIN, von denen alle jetzt eine höhere Priorität als der Komma-Operator haben.

0

Die Antwort wäre die Aussage direkt in die nach der Tabelle FROM JOIN-Anweisung zu setzen, denn das ist die Tabelle, die Sie schließen sich an:

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