2017-05-25 7 views
1

に参加する私のシナリオです:私は3つのテーブルがあります。MySQLの複数テーブルここでは、特殊なケース

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 

私はそれが明らかになっ願っています:ここで

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 

を私が達成したい参加した結果です。この結果を達成する方法はありますか?私は右、外部結合や労働組合、左試してみましたが、私はすでに、インターネット上で検索しようとしましたが、ちょうどそれがキーワードで表すことはできませんが、まだ答えを見つけることができません。私はあなたが理解することを願っていますご協力ありがとうございました!

答えて

1

これはUNIONINNER JOIN 2のsのように見えます。一つは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

最終行は、それはs.item_idではなくi.item_idですか? – fortune

+0

それは私のために完全に動作します。 –

0

あなたの例のすべてのヌルは、あなたが一緒に2つの完全に異なる結果セットに参加しようとしていることを示しています。株式でのアイテムに参加して、すべてのデータを取得し、販売してアイテムに参加し、すべてのことを返しますデータ。トリッキーさは、あなたが望む結合テーブルに2種類の結果があることです。両方のセットが共通に持つのは、アイテムのIDと名前のみです。

組合は(あなたが使用する必要がありますしようとしているものである)同じ数の列を持っている両方のセットが必要です。ただし、セットの列数が異なり、オーバーラップはほとんどありません。結果として、存在しない列をプレースホルダとして明示的に「選択」する必要があります。だからあなたの最後のクエリは次のようになります。次の2つを持っている部分を通る作動

は、結合文:

アイテム+在庫情報を取得します
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 

これは、結合する必要がある2つのクエリです。もちろん、あなたが右のこれらの選択におけるいくつかのテーブルの参照を除外し、異なる結合構文を使用して、少し短いこともできますが、あなたのアイデアを得ます。あなたがここでやりたいと思うジョインの正確なタイプは根本的な問題に依存するので、私はただの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.sales_item_id、sales.sales_idの代わりにsales_itemには – fortune

+0

という非常に明確な説明が必要です。わたしにはできる。ありがとうございました! –

関連する問題