2010-05-12 6 views
10

J'ai eu la requête ci-dessous travailler dans MySQL 4.1, mais ne pas 5.0:MySQL 5 gauche colonne de jointure inconnue

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

L'erreur: 1054 (Unknown column 'e.email' dans 'sur la clause'

Répondre

14

Vous pouvez uniquement référencer les tables précédemment jointes avec la clause JOIN dans la clause 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 

Cela peut être mieux illustré si je mets les guillemets autour du ANSI JOINS dans votre requête originale:

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

Comme vous pouvez le voir, il n'y a pas de source pour e.email l'intérieur des guillemets: voilà pourquoi il n'a pas pu être résolu.

+3

par des guillemets, voulez-vous dire entre parenthèses? Dans la première requête, je ne comprends pas votre explication. De quel article parlez-vous? Pouvez-vous reformuler? Merci – Neil

1

De MySQL documentation page

Auparavant, l'opérateur virgule (,) et JOIN avaient tous deux la même priorité, si l'expression de jointure t1, t2 REJOIGNEZ t3 a été interprété comme ((t1, t2) REJOIGNEZ t3). Maintenant, JOIN a une priorité plus élevée, donc l'expression est interprétée comme (t1, (t2 JOIN t3)). Cette modification affecte les instructions qui utilisent une clause ON, car cette clause ne peut faire référence qu'aux colonnes des opérandes de la jointure et la modification de la priorité change l'interprétation de ces opérandes.

Exemple:

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

Auparavant, le SELECT était légal en raison du regroupement implicite de t1, t2 comme (t1, t2). Maintenant, le JOIN a priorité, donc les opérandes pour la clause ON sont t2 et t3. Comme t1.i1 n'est pas une colonne dans l'un des opérandes, le résultat est une colonne Unknown 't1.i1' dans l'erreur 'on clause'. Pour permettre à la jointure à traiter, regrouper les deux premières tables explicitement entre parenthèses afin que les opérandes pour la clause ON sont (t1, t2) et t3:

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

Vous pouvez également éviter l'utilisation de l'opérateur virgule et utiliser REJOIGNEZ à la place:

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

Cette modification s'applique également aux déclarations qui mélangent l'opérateur virgule avec INNER JOIN, CROSS JOIN, LEFT JOIN et RIGHT JOIN, qui ont tous maintenant une priorité plus élevée que l'opérateur virgule.

0

La réponse serait de placer le parce que c'est la table que vous joindrez sur instruction JOIN directement après la table dans la déclaration,:

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