5.0.12更改后的MySQL LEFT JOIN - 如何重写查询

时间:2009-03-31 12:50:30

标签: mysql join mysql-error-1054

5.0.12之后MySQL更改了左连接的语法以匹配SQL2003标准。所以

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

需要重写为

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

或者它将被解析为... FROM t1 , (t2 LEFT JOIN t3 ON (expr))

现在,我有一个古老的应用程序,我从MySQL 3.23(eek!)移植到5.1,旧代码有这个查询:

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 

这失败,出现SQL错误1054,b.chrggrade中的未知列。这是因为它解析为

选择b。,c。,g。*,p.perfname,p.persname 来自预订b,(客户c 在b.chrggrade = g.grcode上左连接等级g) 在b.person = p.percode上左加入人 其中complete ='Y'和Invoiced ='N' 和'2009-03-25'和'2009-03-31'之间的日期 和c.custcode = b.cust 由cust,person,tsref,stdt

订购

我想。

我确定正确放置括号可以解决这个问题,但我很难过。 我在http://bugs.mysql.com/bug.php?id=13551找到了对此更改的引用,其中显示了如何修复简单的左连接,但我仍然无法解决此查询问题。 大卫

1 个答案:

答案 0 :(得分:4)

完全停止使用逗号语法并在JOIN语句中显式。逗号语法强制您将JOIN条件放在WHERE子句中,这可能在LEFT / RIGHT加入之后才会执行,具体取决于它的解析方式。无论如何,使用显式JOINS使查询更具可读性。

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

这也将解决您所看到的错误。除非预订表中没有chrggrade,否则什么都不能解决错误。