Frage

Nach 5.0.12 geändert MySQL die Syntax für links schließt sich SQL2003-Standard entsprechen. So

... FROM t1 , t2 LEFT JOIN t3 ON (expr)

muss neu geschrieben werden als

... FROM (t1 , t2) LEFT JOIN t3 ON (expr

oder sonst wird es als ... FROM t1 , (t2 LEFT JOIN t3 ON (expr)) analysiert werden

Nun, ich habe eine alte app, die ich von MySQL 3.23 (eek!) Bin Portierung auf 5,1, und der alte Code hat diese Abfrage:

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 

Dies schlägt mit SQL-Fehler 1054, unbekannter Spalte in b.chrggrade. Dies ist, weil es das Parsen als

b wählen. , c. , g. *, P.perfname, p.persname von Buchungen b, (c Kunden links Grad g auf b.chrggrade beitreten = g.grcode) beitreten Person p links auf b.person = p.percode wobei complete = 'Y' und fakturiert = 'N' und datemade zwischen ‚2009-03-25‘ und ‚2009-03-31‘ und c.custcode = b.cust Um von cust, Person, tsref, STDT

denke ich.

Ich bin sicher, richtig platziert Klammern können dieses Problem beheben, aber ich bin ratlos. Ich fand Bezug auf diese Änderung bei http://bugs.mysql.com/bug.php ? id = 13551 , die zeigt, wie eine einfache LEFT JOIN beheben, aber ich kann immer noch nicht für diese Abfrage funktioniert. David

War es hilfreich?

Lösung

Stoppen Sie die Komma-Syntax zusammen und in der JOIN-Anweisungen explizit sein. Die Komma-Syntax zwingt Sie, um die Bedingung in der WHERE-Klausel JOIN zu setzen, die bis bekommen möglicherweise nicht ausgeführt, nachdem links / rechts schließt sich, je nachdem, wie es analysiert. Explizite JOINS macht die Abfrage besser lesbar sowieso.

... FROM T1, T2 LEFT JOIN t3 ON (expr) wird ... FROM t1 INNER JOIN T2 (expr) LEFT JOIN t3 ON (expr)

Das behebt den Fehler auch Sie sehen. Es sei denn, es keine chrggrade in der Buchungen Tabelle ist, dann wird nichts die Fehler beheben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top