代码之家  ›  专栏  ›  技术社区  ›  Will

MYSQL跨多个字段连接2个表

  •  1
  • Will  · 技术社区  · 9 年前

    这应该很简单,但也许酒已经冲昏了我的头。

    表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  | 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
    

    就像我说的,这里的记忆完全超载,我失去了生活的意志。非常感谢您的帮助。提前谢谢。

    2 回复  |  直到 9 年前
        1
  •  2
  •   yxre    9 年前

    它看起来像这样。我写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
  •  2
  •   Adrian Maxwell    9 年前

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

    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
    

    这是未经测试的,但如果您“取消”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被永久规范化,您将不需要这些复杂性。