2015-05-13 104 views
0

我有一個MySQL數據庫與一個表'項目'。SQL加入一對多 - 多個表

每個商品在「價格」表格中可以有多個價格,在'圖片'表格中可以有多個圖片。他們都與物品有一對多的關係。

我很想有一個能夠同時獲取所有數據的查詢,但在查詢中,我得到了很多重複的記錄。如果一個項目有3種價格,3張圖片,我得到9行該項目(而不是期望6):

我的查詢:

SELECT * FROM items 
LEFT JOIN prices 
    ON items.item_id = prices.item_id 
LEFT JOIN images 
    ON items.item_id = images.item_id 
ORDER BY items.item_id 

例如我很想有:

itemid 
    1 item1   price1    NULL 
    1 item1   price2    NULL 
    1 item1   price3    NULL 
    1 item1   NULL    image1 
    1 item1   NULL    image2 
    1 item1   NULL    image3 
    2 item2 .... 
+0

總是會有相同數量的圖像和價格爲給定的項目? – dugas

回答

2

這裏最好的辦法是UNION查詢:

SELECT items.item_id, items.item_name, prices.price, CAST(NULL AS VARCHAR(100)) as image 
    FROM items 
    LEFT JOIN prices 
     ON items.item_id = prices.item_id 

    UNION ALL 

    SELECT items.item_id, items.item_name, NULL, images.image 
    FROM items 
    LEFT JOIN images 
     ON items.item_id = images.item_id 

這將疊加每個查詢在另一個之上,這就是爲什麼CAST()在第一個查詢中作爲圖像數據的佔位符所必需的地位,這些圖像數據最終將堆疊在同一列中。您可能必須更改該VARCHAR(100)以匹配您要拖動的圖像列中的任何數據類型。此外,您可能必須更改字段名稱,因爲我看不到您的架構。

+0

謝謝!我不得不將VARCHAR更改爲CHAR以使其正常工作(即使我的圖像列具有VARCHAR類型..)。這很好用! – Jesse

0

嘗試只joinleft join,像這樣:

SELECT * FROM items 
JOIN prices 
    ON items.item_id = prices.item_id 
JOIN images 
    ON items.item_id = images.item_id 
ORDER BY items.item_id