0

在 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 上离开加入人员 p,其中 complete='Y'并且 invoiced='N' 和 datemade 在 '2009-03-25' 和 '2009-03-31' 之间,并且 c.custcode=b.cust 由 cust、person、tsref、stdt 订购

我认为。

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

4

1 回答 1

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)

这也将解决您看到的错误。除非 bookings 表中没有 chrggrade,否则没有任何东西可以修复错误。

于 2009-03-31T13:13:53.317 回答