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(伊克!)移植到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未知柱。这是因为它的解析作为

选择湾,克。*,p.perfname,p.persname 从预订B,(客户C 留在b.chrggrade加入级G = g.grcode) 左加入的人员P上b.person = p.percode 其中完整=“Y”和发票=“N” 和“2009-03-25”之间datemade“2009-03-31” 和c.custcode = b.cust 为了通过卡斯特,人,TSef文档,STDT

我想。

我敢肯定,正确放置支架可以解决这个问题,但我难倒。 我发现在 http://bugs.mysql.com/bug.php参考这一变化?ID = 13551 ,它展示了如何解决一个简单的左加入,但我仍然不能工作了此查询。 大卫

有帮助吗?

解决方案

完全停止使用逗号语法和在你的JOIN声明明确。逗号语法迫使你把JOIN条件的WHERE子句,它可能不会直到后左/右连接,这取决于它是如何解析的执行英寸使用显式JOINS使得查询反正更具有可读性。

... FROM T1,T2 LEFT JOIN T3 ON(表达式) 变 ... FROM T1 INNER JOIN T2 ON(表达式)LEFT JOIN T3 ON(表达式)

这也将解决你所看到的错误。除非有在预约表中没有chrggrade,则事修复错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top