2009-03-31 7 views
0

Nach 5.0.12 MySQL geändert die Syntax für linke Joins zu SQL2003 Standard entsprechen. SoMySQL LEFT JOIN nach 5.0.12 Änderungen - Wie schreibe ich die Abfrage

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

Bedürfnisse neu geschrieben werden als

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

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

Jetzt habe ich eine alte app, die ich von MySQL bin Portierung 3,23 (eek!) zu 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, unbekannt Spalte in b.chrggrade. Dies liegt daran, dass die Analyse wie folgt erfolgt:

auswählen b. , c., g. *, P.perfname, p.persname von Buchungen b, (c Kunde links Grad g auf b.chrggrade = g.grcode beitreten) Person p beizutreten links auf b.person = p.percode wo complete = 'Y' und fakturiert = 'N' und datemade zwischen '2009-03-25' und '2009-03-31' und c.custcode = b.cust bestellen von cust, person, tsref, stdt

Ich denke.

Ich bin mir sicher, richtig platzierte Klammern können das beheben, aber ich bin ratlos. Ich fand einen Verweis auf diese Änderung unter http://bugs.mysql.com/bug.php?id=13551, die zeigt, wie man einen einfachen linken Join repariert, aber ich kann es immer noch nicht für diese Abfrage ausarbeiten. David

Antwort

4

Beenden Sie die Verwendung der Kommasyntax zusammen und explizit in Ihren JOIN-Anweisungen. Die Kommasyntax zwingt Sie, die JOIN-Bedingung in die WHERE-Klausel einzufügen, die möglicherweise erst nach der Verknüpfung von LEFT/RIGHT ausgeführt wird, je nachdem, wie sie analysiert wird. Explizite JOINS macht die Abfrage trotzdem lesbarer.

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

, die auch den Fehler beheben du siehst. Es sei denn, es gibt kein chrggrade in der Buchungstabelle, dann wird nichts den Fehler beheben.