2017-05-25 44 views
1

這裏是我的情況:我有3個表:mysql的多表連接的特殊情況

items table 

item_id |name 
---------------- 
1  |item 1 
2  |item 2 
etc 

stocks table 

stock_id |item_id |quantity 
--------------------------- 
1  |1  |10 
2  |2  |20 
etc 

sales_item tables 
sales_item_id |sales_id |item_id |price 
--------------------------------------- 
1    |1  |1  |100 
2    |1  |2  |200 
etc 

這裏是連接的結果我想實現:

joined table 

item_id |name |stock_id |quantity |sales_item_id |sales_id |price 
------------------------------------------------------------------- 
1  |item1 |1  |10  |null   |null  |null 
1  |item1 |null  |null  |1    |1  |100 
2  |item2 |2  |10  |null   |null  |null 
2  |item2 |null  |null  |2    |1  |200 

我希望我清楚。有什麼辦法可以達到這個結果嗎?我嘗試過左,右,外連接和聯合,並且我已經嘗試過在互聯網上進行搜索,只是它不能通過關鍵字來表示,但仍然找不到答案。我希望你的傢伙明白。感謝您的幫助!

回答

1

這看起來像是兩個INNER JOIN s的UNION。一個從stock獲得信息並且在sales_item的列中具有NULL值,另一個從sales_item獲得信息並且對於stock的列獲得NULL

SELECT i.item_id, i.name, s.stock_id, s.quantity, NULL AS sales_item_id, NULL AS sales_id, NULL AS price 
FROM items AS i 
JOIN stocks AS s ON s.item_id = i.item_id 
UNION 
SELECT i.item_id, i.name, NULL, NULL, si.sales_item_id, si.sales_id, si.price 
FROM items AS i 
JOIN sales_item AS si ON i.item_id = si.item_id 
+0

最後一行,就是這樣,i.item_id代替s.item_id? – fortune

+0

它適合我。感謝您的幫助 –

0

在你的榜樣所有的空值顯示你正試圖聯合起來兩個完全不同的結果集:與股票加入的項目,並獲得所有這些數據,然後再加入與銷售的項目,並返回所有數據。詭異的是你在你想要的連接表中有兩種不同的結果。這兩套產品唯一的共同點就是產品編號和名稱。

聯合(這是你將不得不使用的)需要兩個集合具有相同數量的列。但是,您的套件具有不同的列數,並且重疊很少。因此,您必須明確地「選擇」一些不存在的列作爲佔位符。因此,最終的查詢應該是這個樣子:

合作,通過您有部分兩個連接語句:

SELECT items.item_id, items.name, stocks.stock_id, stocks.quantity FROM items JOIN stocks ON stocks.item_id=items.id 

,得到您的項目+股票信息。然後再加入以獲取銷售數據:

SELECT items.item_id, items.name, sales.sales_item_id, sales.sales_id, sales.price FROM items JOIN sales_item ON sales_item.item_id=items.item_id 

這些是您需要連接的兩個查詢。當然,你可以通過在select中省略一些表引用並使用不同的連接語法來縮短這一點,但你明白了。你想在這裏做的連接的確切類型將取決於你的基本問題,所以我只是猜測一個簡單的JOIN(這是一個INNER JOIN的別名)。

現在你需要把它們與UNION一起,當你這樣做,你必須在一些列添加爲佔位符:

SELECT items.item_id, items.name, stocks.stock_id, stocks.quantity, null AS sales_item_id, null AS sales_id, null AS price FROM items JOIN stocks ON stocks.item_id=items.id 
UNION ALL 
SELECT items.item_id, items.name, null AS stock_id, null AS quantity, sales.sales_item_id, sales.sales_id, sales.price FROM items JOIN sales_item ON sales_item.item_id=items.item_id 

然後(如果需要的話),你可以在一個排序扔:

SELECT * FROM (
    SELECT items.item_id, items.name, stocks.stock_id, stocks.quantity, null AS sales_item_id, null AS sales_id, null AS price FROM items JOIN stocks ON stocks.item_id=items.id 
    UNION ALL 
    SELECT items.item_id, items.name, null AS stock_id, null AS quantity, sales.sales_item_id, sales.sales_id, sales.price FROM items JOIN sales_item ON sales_item.item_id=items.item_id 
) U order by item_id ASC 
+0

在您的查詢中,其不是items.id,而是items.item_id,而不是sales.sales_item_id,sales.sales_id代替銷售,其sales_item需要 – fortune

+0

非常明確的解釋。這個對我有用。謝謝! –