2012-09-14 24 views
4

說我有一個包含各種類型的編碼表,替換值ID爲前:的MySQL JOIN從另一個表

ID EncodingName 
    ------------------ 
    1 UTF-8 
    2 ISO-8859-1 

而另一EncodingMapping使用這些ID來跟蹤哪些編碼轉換從和到:

ID ItemId_FK EncodingFromId_FK EncodingToId_FK 
    ------------------------------------------------- 
    1 45   2     1 
    2 78   1     2 

我想創建一個用於創建以下結果的SQL語句時ItemId_FK = 45(例如):

FromEncoding ToEncoding 
    ------------------------- 
    ISO-8859-1 UTF-8 

似乎它會很簡單,但我不能通過以這種格式返回單行來獲得JOIN工作。

我有什麼事這麼遠(這是錯誤的):

SELECT EncodingName As FromEncoding, EncodingName As ToEncoding 
    FROM Encoding 
    LEFT JOIN EncodingMapping As em 
    ON Encoding.ID = em.EncodingFromId_FK OR Encoding.ID = em.EncodingToId_FK 
    WHERE ItemId_FK = 45 

回答

8

關閉,但不是雪茄:

SELECT 
    FromEnc.EncodingName AS FromEncoding, 
    ToEnc.EncodingName AS ToEncoding 
FROM EncodingMapping 
INNER JOIN Encoding AS FromEnc 
    ON FromEnc.ID=EncodingMapping.EncodingFromId_FK 
INNER JOIN Encoding AS ToEnc 
    ON ToEnc.ID=EncodingMapping.EncodingToId_FK 
WHERE EncodingMapping.ItemId_FK = 45 
+0

謝謝。其他一些答案使用了LEFT JOIN而不是INNER JOIN。你能解釋什麼時候在這方面使用? – http203

+2

@ http203:Jeff在他的博客文章[SQL連接的可視化解釋](http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins。 HTML)。 – eggyal

0

你只需要雙擊加入同一個表:

SELECT from.EncodingName AS FromEncoding, 
    to.EncodingName AS ToEncoding 
FROM EncodingMapping AS m 
LEFT JOIN Encoding AS from ON m.EncodingFromId_FK=from.ID 
LEFT JOIN Encoding AS to ON m.EncodingToId_FK=to.ID 
WHERE ItemId_FK=45 

需要注意的是,在簡單ID列上包括_FK擴展名似乎有點多餘。

0

按照你的意思,你應該有兩個連接。一個是「FromEncoding」,另一個是「ToEncoding」。

像這樣:

Select FromEncoding.Title 
, ToEncoding.Title 
    From EncodingOrder 
    Inner Join 
     Encoding  As FromEncoding 
    On FromEncoding.Id  = EncodingOrder.From_Encoding_Id 
    Inner Join 
     Encoding  As ToEncoding 
    On ToEncoding.Id  = EncodingOrder.To_Encoding_Id 

乾杯