2011-07-15 97 views
1

起初我以为这可能作为一个连接工作,但我不确定这是一个真正的联合命令还是甚至可能。以下是两个表格的示例,每个表格还包含大约20个以上各种不同数据的列。Mysql union /加入多列帮助

表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中,但他们的名字替换数据筒,的productID和包标识从表2中使用匹配的item_id。尝试使用foreach之外的mysql来完成此操作,但对于具有30k行的表2,它尝试显示表1中的数百行并用相同的名称替换每个标识时,它只会“稍微”一点。

回答

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

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

+0

这工作得很好,但现在列名称更改为名称,姓名,名称。任何方式来保持列名称? – Sara

+0

明白了。我必须在开始时改变它。 t2c.name,t2pr.name,t2pk.name成为t2c.name AS containerID,t2pr.name AS productID,t2pk.name AS packageID – Sara

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

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;