2016-01-19 50 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被永久归你就不需要这些复杂性。