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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top