2011-07-15 69 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;