2014-11-06 80 views
0

在Access中我有一个使用内部连接和IF语句的查询。我是否可以在MySQL中使用它,因为它看起来不像预期的那样工作,不确定是否缺少某些东西或者MySQL不允许这种方法?内部加入IF声明?

SELECT Matrix.Model, Payment.Cost 
FROM Payment 
INNER JOIN Matrix ON if(Left(Matrix.Model,1)='S', Left(Matrix.Model,2), Left(Matrix.Model,1) = Matrix.PreFix) 
GROUP BY Matrix.Model 

我似乎得到一切都返回,不以S开头,就好像该方法是无效的,但不会导致重大错误。

+0

试试这些链接,可能是它对你的帮助..... http://stackoverflow.com/questions/15640321/conditional-inner-join-statements-in-mysql ...... http:// stackoverflow.com/questions/5585338/mysql-inner-join-if-statement ........ http://stackoverflow.com/questions/8038322/how-to-choose-inner-join-field-with -if-case – deemi 2014-11-06 12:06:23

+0

我认为你只是在错误的地方有你的右括号。您正在基于_Left(Matrix.Model,2)_评估为true或_Left(Matrix.Model,1)= Matrix.PreFix_评估为true,根据_Left(Matrix.Model,1)的值进行连接。 ='S'_。将结束括号从连接条件的末尾移到等号之前。 – Kickstart 2014-11-06 12:48:06

回答

2

这是您的查询(使用表的别名,以使其更具可读性):

SELECT m.Model, p.Cost 
FROM Payment p INNER JOIN 
    Matrix m 
    ON if(Left(m.Model,1) = 'S', Left(m.Model, 2), Left(m.Model, 1) = m.PreFix) 
GROUP BY m.Model; 

注意,有来自这种说法两种可能的回报:Left(m.Model, 2)Left(m.Model, 1) = m.PreFix。这是一个数字上下文,所以then子句被解释为一个数字。以非数字字符开头的字符串(如S)将转换为0,该字符为false。

我会写这个没有if()

SELECT m.Model, p.Cost 
FROM Payment p INNER JOIN 
    Matrix m 
    ON (m.model like 'S%' and m.Prefix = Left(m.Model, 2)) or 
     (m.model not like 'S%' and m.Prefix = Left(m.Model, 1)) 
GROUP BY m.Model; 

此外,列p.cost将是一个不确定行的值 - 这是既不在group by也不是在一个聚合函数。这个构造不适用于任何其他数据库。它使用了MySQL的扩展,除非你真正理解你在做什么,否则通常不会使用它。

+0

非常棒,谢谢戈登 - 这就像一个魅力。与Access的工作方式不同的方法,但对于新手来说仍然非常容易理解。钽 – Palendrone 2014-11-06 13:54:38