Mysql
 sql >> Base de données >  >> RDS >> Mysql

Mélange de JOIN ANSI 1992 et de virgules dans une requête

Selon ce lien , vous ne devez pas confondre les deux notations lors de la création de jointures. La virgule que vous utilisez pour rejoindre memebers as m, telephone as t , et les appels ultérieurs à inner join , déclenchent l'erreur de colonne inconnue.

Pour y faire face, utilisez CROSS/INNER/LEFT JOIN au lieu de virgules.

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

Dans un but pédagogique, j'ajoute la requête telle qu'elle devrait être, je pense :

SELECT m.*, t.*
FROM memebers as m 
    JOIN telephone as t
    JOIN memeberFunctions as mf ON m.id = mf.memeber AND mf.function = 32
    JOIN mitgliedTelephone as mt ON m.id = mt.memeber

Puisque vous ne rejoignez pas t et m , le résultat final sera un produit cartésien ; vous voudrez peut-être qu'il soit révisé.

J'espère que cela a aidé.