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找到了对此更改的引用,其中显示了如何修复简单的左连接,但我仍然无法解决此查询问题。 大卫
答案 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,否则什么都不能解决错误。