2016-01-19 49 views
1

它應該是這麼簡單,但也許酒已經走到了我的腦海。MYSQL加入2個表格跨多個領域

表A(即需要份的東西)

id | Name   | part1 | part2 | part 3 | part 4 | etc 
1 | This thing | 1 | 2 | 3 | 2 | etc 
2 | another thing | 1 | 1 | 4 | 5 | etc 
3 | even more  | 11 | 2 | 2 | 2 | etc 

表B(份)

id | Description 
1 | I am a part 
2 | I am another Part 
3 | Im a very imprtant part 

A ;;其實,我需要做的是選擇所有「零件」,每個「東西」需要通過它的「描述」

,所以我得到了各行的英文,而不是ID號是

id | Thing name | part 1  | part 2  | part 3  | part 4 
1 | This Thing | name of part | name of part | name of part | name of part 

就像我說過的,在這裏完全記憶過度,我失去了生活的意志。任何幫助非常gratefull收到。提前致謝。

+0

我認爲,而不是做左連接,從長遠來看最好是規範化你的數據模型 – Conan

回答

2

它看起來像這樣。自從我寫了一個MySQL查詢以來,它已經有一段時間了我相信有人可以改進它。

SELECT 
    a.id, 
    a.name, 
    b1.description, 
    b2.description, 
    b3.description, 
    b4.description 
FROM 
    table_a `a` 
     LEFT JOIN 
    table_b `b1` 
     ON a.part1 = b1.id 
     LEFT JOIN 
    table_b `b2` 
     ON a.part2 = b2.id 
     LEFT JOIN 
    table_b `b3` 
     ON a.part3 = b3.id 
     LEFT JOIN 
    table_b `b4` 
     ON a.part4 = b4.id 
2

您的數據模型註定了您從一開始就非常複雜。

select 
* 
from TableA A 
left join TableB B1 on A.part1 = B1.id 
left join TableB B2 on A.part2 = B1.id 
left join TableB B3 on A.part3 = B1.id 
left join TableB B4 on A.part4 = B1.id 

這是未經測試的,但如果您「unpivot」TableA更多的可能性打開。 例如

SELECT 
     A.id 
    , A.Name 
    , GROUP_CONCAT(B.Description ORDER BY A.rowno) as PartsList 
FROM (
     SELECT 
      A1.id 
      , A1.Name 
      , cj.rowno 
      , CASE 
        WHEN cj.rowno = 1 THEN part1 
        WHEN cj.rowno = 2 THEN part2 
        WHEN cj.rowno = 3 THEN part3 
        WHEN cj.rowno = 4 THEN part4 
      END AS LinkID 
     FROM TableA a1 
      CROSS JOIN (1 AS rowno 
        UNION ALL SELECT 2 
        UNION ALL SELECT 3 
        UNION ALL SELECT 4 
       ) cj 
    ) A 
     LEFT JOIN TableB B ON A.LinkId = B.ID 
GROUP BY 
     A.id 
    , A.Name 

,並在表A被永久歸你就不需要這些複雜性。