MySQL LEFT JOIN nach 5.0.12 Änderungen - Wie Abfrage neu zu schreiben
-
22-08-2019 - |
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
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.