MySQL 5 Partecipa colonna sinistra sconosciuto
-
26-09-2019 - |
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')
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