Domanda

ho avuto il seguito di query che lavora in MySQL 4.1, ma non lo fa in 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

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

È stato utile?

Soluzione

È possibile fare riferimento solo le tabelle in precedenza unite con la 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 parentesi intorno 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 parentesi:. È per questo che non può essere risolto

Altri suggerimenti

MySQL pagina di documentazione

In precedenza, l'operatore virgola (,) e ISCRIVITI entrambi avevano la stessa precedenza, quindi l'espressione di unione t1, t2 ENTRARE t3 è stato interpretato come ((t1, t2) si uniscono t3). Ora ENTRARE ha precedenza maggiore, quindi l'espressione viene interpretata come (t1, (t2 ENTRARE t3)). Questa modifica interessa le istruzioni che utilizzano una clausola ON, perché tale clausola può fare riferimento solo alle colonne nei operandi della giunzione, e il cambiamento in precedenza cambia interpretazione di ciò che questi operandi sono.

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, la SELEZIONA 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 uno degli operandi, il risultato è una colonna Unknown 't1.i1' a 'sulla clausola' errore. Per consentire il join da lavorare, gruppo i primi due tabelle in modo esplicito 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);

In 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 precedenza maggiore dell'operatore virgola.

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

SELECT * 
FROM email e 
LEFT JOIN member m on m.email=e.email, 
event_email ee 
WHERE ee.email_id = e.email_id
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top