MYSQL 跨多个字段连接 2 个表

MYSQL joining 2 tables accross multiple fields

应该很简单哦,不过可能是酒醉了。

Table 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

Table B(零件)

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

一个;;我实际上需要做的是 select 每个 "thing" 需要的所有 "parts" "DESCRIPTION"

所以我得到的每一行都是英文的,而不是 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

就像我说的,这里完全是记忆超载,我失去了活下去的意志。非常感谢收到的任何帮助。提前致谢。

它看起来像这样。自从我写了一个 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

您的数据模型从一开始就注定了您的复杂性。

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

并且,如果 TableA 被永久规范化,您将不需要这些复杂性。