MySQL连接操作:使用另一张表中的值替换ID。

5

假设我有一个包含各种类型的编码表,例如:

    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
3个回答

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

谢谢。其他一些答案使用了 LEFT JOIN 而不是 INNER JOIN。您能解释在这种情况下何时使用哪个吗? - http203
2
@http203:Jeff在他的博客文章中讲得很清楚,SQL连接的可视化解释 - eggyal

1

您只需要在同一张表中进行双重连接:

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

干杯


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接