Mysql union / join帮助多列

时间:2011-07-15 02:34:35

标签: mysql sql join

起初我认为这可能是一个连接,但我不确定这是否真的是一个联合命令,或者甚至可能。下面是两个表的示例,每个表还有大约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将tableID,productID和packageID替换为表2中的名称。尝试使用foreach在mysql之外执行此操作,但是当表2具有30k行时,它在尝试显示表1中的数百行并用其等效名称替换每个id时“略微落后”。

3 个答案:

答案 0 :(得分:3)

要查看所有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,但任何不匹配所有三行的行都不会在结果集中。

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

答案 1 :(得分: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;

答案 2 :(得分:0)

您需要为每个item_id加入每行三次

   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

上有索引