2010-05-12 16 views
10

ho avuto la query di seguito lavora in MySQL 4.1, ma non lo fa in 5,0:MySQL 5 left join sconosciuto colonna

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

L'errore: 1054 (colonna Unknown 'e.email' in 'sulla clausola')

risposta

14

È possibile solo fare riferimento alle tabelle precedentemente associate alla clausola JOIN nella clausola 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 

Ciò può essere illustrato meglio se metto le virgolette attorno al ANSI JOINS nella vostra domanda originale:

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

Come si può vedere, non v'è alcuna fonte per e.email all'interno delle virgolette: è per questo che non può essere risolto.

+3

tra virgolette, vuoi dire parentesi? Nella prima query, non capisco la tua spiegazione. A quale clausola si riferisce? Puoi ripetere? Grazie – Neil

1

Da MySQL documentation page

precedenza, l'operatore virgola (,) e ENTRARE entrambi avevano la stessa precedenza, quindi il join espressione t1, t2 JOIN t3 è stato interpretato come ((t1, t2) ENTRARE t3). Ora JOIN ha precedenza più alta, quindi l'espressione è interpretata come (t1, (t2 JOIN t3)). Questa modifica influisce sulle istruzioni che utilizzano una clausola ON, poiché quella clausola può fare riferimento solo alle colonne negli operandi del join e la modifica nella precedenza modifica l'interpretazione di ciò che sono tali operandi.

Esempio:

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

In precedenza, SELECT era legale a causa del raggruppamento implicito t1, t2 come (t1, t2). Ora il JOIN ha la precedenza, quindi gli operandi per la clausola ON sono t2 e t3. Poiché t1.i1 non è una colonna in nessuno degli operandi, il risultato è una colonna sconosciuta 't1.i1' nell'errore 'on clause'. Per consentire la giunzione da elaborare, gruppo i primi due tabelle esplicitamente con le parentesi in modo che gli operandi per la clausola ON sono (t1, t2) e t3:

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

alternativa, evitare l'uso dell'operatore virgola e utilizzare invece:

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

Questa modifica si applica anche alle dichiarazioni che mescolano l'operatore virgola con INNER JOIN, CROSS JOIN, LEFT JOIN e RIGHT JOIN, i quali ora hanno la precedenza superiore rispetto l'operatore virgola.

0

La risposta potrebbe essere quella di inserire l'istruzione JOIN direttamente dopo la tabella nella dichiarazione, perché questo è il tavolo si stanno unendo a:

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