【问题标题】:Mysql union/join help with multiple columnsMysql union/join 对多列的帮助
【发布时间】:2011-07-15 02:34:34
【问题描述】:

起初我认为这可能是一个连接,但我不确定这是否真的是一个联合命令,或者是否可能。下面是两个表的示例,每个表都有大约 20 列不同的数据。

表 1

>     id    assembly    user1    user2    containerID    productID    packageID
      1     line2       Billy    John     3794           4892         4589
      2     line4       John     Doug     7794           6201         7864

表 2

>     item_id    name    width    height    weight    flag1    flag2
      3794       Box     10       10        10        0        1
      4892       Lamp    4        6         2         1        1
      7864       BigBox  200      200       300       4        5      

我要做的是显示所有表 1,但使用匹配的 item_id 将 containerID、productID 和 packageID 替换为表 2 中的名称。尝试在 mysql 之外使用 foreach 执行此操作,但表 2 有 30k 行,当尝试显示表 1 中的数百行并将每个 id 替换为其等效名称时,它“有点”滞后。

【问题讨论】:

    标签: mysql sql join


    【解决方案1】:

    要查看所有 table_1 记录,请使用:

       SELECT t1.id, t1.assembly, t1.user1, t1.user2, 
              t2c.name, t2pr.name, t2pk.name
         FROM TABLE_1 t1
    LEFT JOIN TABLE_2 t2c ON t2c.item_id = t1.containerid
    LEFT JOIN TABLE_2 t2pr ON t2pr.item_id = t1.productid
    LEFT JOIN TABLE_2 t2pk ON t2pk.item_id = t1.packageid
    

    您可以将它们更改为 INNER JOIN,但任何不匹配所有三个的行都不会出现在结果集中。

    我的查询使用表别名,因为您必须为要查找的每个 name 加入相应的 TABLE_2 列。

    【讨论】:

    • 这很好用,但列名现在更改为名称、名称、名称。有什么方法可以保留列名?
    • 知道了。我不得不在一开始就改变它。 t2c.name, t2pr.name, t2pk.name 变成 t2c.name AS containerID, t2pr.name AS productID, t2pk.name AS packageID
    【解决方案2】:

    尝试使用这样的东西:

      SELECT id, assembly, user1, user2, 
             (SELECT name from table2 where item_id = table1.containerID), 
             (SELECT name from table2 where item_id = table1.productID), 
             (SELECT name from table2 where item_id = table1.packageID)
        FROM table1 
    ORDER BY id;
    

    【讨论】:

      【解决方案3】:

      您需要为每个 item_id 将每一行加入 3 次

         SELECT t1.*, t21.name,t22.name,t23.name FROM table_1 t1
             INNER JOIN table_2 t21 ON t1.containerID = t21.itemid
             INNER JOIN table_2 t22 ON t1.productId = t22.itemid
             INNER JOIN table_2 t23 ON t1.packageID = t23.itemid
      

      确保 table_2 的 itemid 上有索引

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多