MySQL LEFT JOIN après 5.0.12 modifications - Comment réécrire la requête
-
22-08-2019 - |
Question
Après 5.0.12 MySQL a changé la syntaxe pour les jointures gauche pour correspondre à la norme SQL2003. Donc,
... FROM t1 , t2 LEFT JOIN t3 ON (expr)
doit être réécrite comme
... FROM (t1 , t2) LEFT JOIN t3 ON (expr
ou bien il sera analysé comme ... FROM t1 , (t2 LEFT JOIN t3 ON (expr))
Maintenant, j'ai une application ancienne que je suis le portage de MySQL 3,23 (eek!) À 5,1, et l'ancien code a cette requête:
select b.*, c.*, g.*, p.perfname, p.persname
from bookings b, customer c
left join grade g on b.chrggrade=g.grcode
left join person p on b.person=p.percode
where complete='Y' and invoiced='N'
and datemade between '2009-03-25' and '2009-03-31'
and c.custcode=b.cust
order by cust, person, tsref, stdt
Cela échoue avec l'erreur SQL 1054, colonne inconnue dans b.chrggrade. En effet, il est comme l'analyse syntaxique
sélectionnez b. , c. , g. *, P.perfname, p.persname de réservations b, (c client jointure gauche de grade g sur b.chrggrade = g.grcode) left join personne p sur b.person = p.percode où « y » = complètes et facturées = « N » et datemade entre « 2009-03-25 » et « 2009-03-31 » et c.custcode = b.cust par ordre Cust, personne, tsref, STDT
Je pense.
Je suis sûr que crochets placés correctement peuvent résoudre ce problème mais je suis perplexe. J'ai trouvé référence à ce changement http://bugs.mysql.com/bug.php ? id = 13551 , qui montre comment fixer simple jointure gauche, mais je ne peux toujours pas dehors pour cette requête. David
La solution
Arrêtez d'utiliser la syntaxe des virgules et tout à fait explicite dans vos déclarations JOIN. Les forces de syntaxe par des virgules que vous mettiez la condition JOIN dans la clause WHERE, qui ne peut s'exécuter qu'après GAUCHE / DROITE rejoint, selon la façon dont il est analysé. L'utilisation explicite REJOINT rend la requête plus lisible de toute façon.
... FROM t1, t2 LEFT JOIN t3 (expr) devient ... DE t2 REJOIGNEZ t1 INNER ON (expr) LEFT JOIN t3 (expr)
Cela aussi corriger l'erreur que vous voyez. À moins qu'il n'y a pas chrggrade dans le tableau de réservations, alors rien ne corrigera l'erreur.