2017-07-13 8 views
0

アイテムの複数の在庫を管理するデータベースがあります。今、私はそこに存在していない項目を含むそれぞれの場所にあるすべてのアイテムを一覧表示することができますどのようにmysqlクエリを使用して、在庫のある場所への外部キーを持つすべてのアイテム

table_items 
+----------+-------------+ 
| id_items |  name | 
+----------+-------------+ 
| 1  | item 1 | 
| 2  | item 2 | 
+----------+-------------+ 

table_location 
+-------------+-------------+ 
| id_location |  name | 
+-------------+-------------+ 
| 1   | location 1| 
| 2   | location 2| 
+-------------+-------------+ 

table_stock 
+-------------+-----------+----------+ 
| id_location | id_item | stock | 
+-------------+-----------+----------+ 
| 1   | 1  |  3 | 
| 1   | 2  |  0 | 
| 2   | 1  |  1 | 
+-------------+-----------+----------+ 

: は、私のような3テーブルを持っています。たとえば、私は場所2でアイテムを取得したいので、その結果は次のようになります。

+-------------+-----------+----------+ 
| id_location | id_item | stock | 
+-------------+-----------+----------+ 
| 2   | 1  |  1 | 
| 2   | 2  | null | 
+-------------+-----------+----------+ 

または多分このような何かを行うには、他の方法がありますか..?これはあなたの場所&アイテム賢明総株式を与える

SELECT s.id_location, i.id_items, CASE WHEN sum(stock)=0 THEN null ELSE sum(stock) END AS stock 
FROM table_items i LEFT JOIN table_stock s ON i.id_items=s.id_items 
WHERE s.id_location=2 
GROUP BY s.id_location, i.id_items; 

答えて

0
SELECT 
    a.* 
FROM 
    (SELECT 
    i.`id_items`, 
    CASE WHEN s.id_location=2 THEN s.id_location ELSE 2 END AS id_location, 
    CASE WHEN s.id_location=2 THEN s.`stock` ELSE 0 END AS stock 
    FROM 
    table_items i 
    LEFT JOIN `table_stock` s 
     ON i.`id_items` = s.`id_items` 
    WHERE id_location = 2 
    UNION 
    SELECT 
    i.`id_items`, 
    CASE WHEN s.id_location=2 THEN s.id_location ELSE 2 END AS id_location, 
    CASE WHEN s.id_location=2 THEN s.`stock` ELSE 0 END AS stock 
    FROM 
    table_items i 
    LEFT JOIN `table_stock` s 
     ON i.`id_items` = s.`id_items` 
    WHERE id_location != 2 
    AND i.id_items NOT IN 
    (SELECT 
     i.`id_items` 
    FROM 
     table_items i 
     LEFT JOIN `table_stock` s 
    ON i.`id_items` = s.`id_items` 
    WHERE id_location = 2)) a 

私はこのクエリを使用して、最適化のための意見を求めました。

0

は、この文字列で検索してください。これがあなたの問題を解決することを願っています。

+0

私はここに何かが欠けていると思う、結果は私の質問の例のようなものではないようです。私は** id_location **と** id_item **が必要です。その罰金は0かヌルかどうかです。 – inumaru

+0

@inumaruあなたの要件を理解するごとに、これはうまくいくと思います。このクエリは、あなたに場所とアイテムの賢明な総株を与えるでしょう。あなただけの位置を必要とする場合は、投影&グループ化からid_itemsを削除することができます。逆に商品の賢明さについてはVisa。 –

+0

私の条件は、私の例のようにその場所に在庫がないものを含む、1つの場所のすべての商品のリストです。私はあなたのことを試しましたが、 'id_location = 2'を追加するとすべての項目を取得できません – inumaru

関連する問題