2

这是一个我无法解释的奇怪现象:

FROM (
   SELECT @report_date := 
     IF (DAYOFWEEK(CURDATE()) BETWEEN 3 AND 7, DATE_SUB(CURDATE(), INTERVAL 1 DAY), 
       IF (DAYOFWEEK(CURDATE()) = 1, DATE_SUB(CURDATE(), INTERVAL 2 DAY),
         IF (DAYOFWEEK(CURDATE()) = 2, DATE_SUB(CURDATE(), INTERVAL 3 DAY), NULL)))
) AS dt
 , t1
LEFT JOIN t2 ON t1.id = t2.id

http://sqlfiddle.com/#!2/9e0c4/3

作品。

FROM t1
 , (
   SELECT @report_date := 
     IF (DAYOFWEEK(CURDATE()) BETWEEN 3 AND 7, DATE_SUB(CURDATE(), INTERVAL 1 DAY), 
       IF (DAYOFWEEK(CURDATE()) = 1, DATE_SUB(CURDATE(), INTERVAL 2 DAY),
         IF (DAYOFWEEK(CURDATE()) = 2, DATE_SUB(CURDATE(), INTERVAL 3 DAY), NULL)))
) AS dt
LEFT JOIN t2 ON t1.id = t2.id

http://sqlfiddle.com/#!2/9e0c4/2

不起作用,错误:

Unknown column 't1.id' in 'on clause': ...

为什么?注意子句t1中声明where 的顺序。FROM


请注意,我不一定要寻找替代方案,我只是想了解为什么这里的订单会导致 a 出现错误JOIN,我认为在该FROM子句完成后会发生这种错误。

如果有人对我如何在这里结束感兴趣,请参阅这个破碎的小提琴这个工作小提琴,以获得真实查询的基本示例。

4

2 回答 2

3

这是因为你正在混合ANSINON-ANSI加入。而不是使用comma,将其替换为CROSS JOIN

问题是优先级,而 the 的JOIN优先级高于隐含的,

以前,逗号运算符 ( ,) 和JOIN两者具有相同的优先级,因此连接表达式 t1, t2JOIN t3被解释为 ((t1, t2) JOIN t3)。NowJOIN具有更高的优先级,因此表达式被解释为(t1, (t2 JOIN t3)). 此更改会影响使用ON子句的语句,因为该子句只能引用连接操作数中的列,并且优先级的更改会更改对这些操作数的解释。

http://dev.mysql.com/doc/refman/5.0/en/join.html

用于CROSS JOIN替换隐式JOIN

FROM t1
CROSS JOIN (
   SELECT @report_date := 
     IF (DAYOFWEEK(CURDATE()) BETWEEN 3 AND 7, DATE_SUB(CURDATE(), INTERVAL 1 DAY), 
       IF (DAYOFWEEK(CURDATE()) = 1, DATE_SUB(CURDATE(), INTERVAL 2 DAY),
         IF (DAYOFWEEK(CURDATE()) = 2, DATE_SUB(CURDATE(), INTERVAL 3 DAY), NULL)))
) AS dt
LEFT JOIN t2 ON t1.id = t2.id

http://sqlfiddle.com/#!2/9e0c4/21

于 2013-07-28T16:09:30.033 回答
0

您也可以在没有左连接的情况下使用它。用逗号分隔所有表格

-在这里拉小提琴

编辑:

要么只使用连接,要么只使用分隔的逗号表但不混合使用。

于 2013-07-28T16:17:00.577 回答