2014-11-06 85 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