0

shop テーブル、stock テーブル、stock_amounts テーブルの 3 つのテーブルがあります。shop テーブルは各ショップの詳細を定義し、stock テーブルはすべての在庫アイテムを定義し、stock_mounts テーブルは各ショップがアイテムの在庫をどれだけ持っているかを定義します。

私のテーブルは次のようになります。

*Shop table:
| id | shop
-------------
| 1  | Head Office
| 2  | shop 1

*Stock table:
| id | stock_description
------------------------
| 1  | Some description
| 2  | Some description
| 3  | Some description

*Stock amounts table:
| id | shop_id | stock_id | stock_amount
------------------------------------------
| 1  | 1       | 1        | 5
| 2  | 2       | 2        | 4

ショップの在庫をすべて表示したいのですが、そのショップに定義されていない在庫も表示します。たとえば、ショップ 1 には在庫 1 が 5 つありますが、在庫 2 または在庫 3 はありません。在庫 2 および 3 をゼロまたは NULL 値として表示したいと考えています。

私は現在、すべてに参加しています。句に何も指定しない場合WHERE、在庫のあるすべてのショップが表示され、未定義の値には NULL が表示されます。すると、すべての NULL 値がWHERE stock_amounts.id <> '2'表示されなくなります。

知りたいこと:
1) WHERE 句で 'not 2' を指定すると NULL が表示されなくなったのはなぜですか?
2) これを行う適切な方法は何ですか? また、適切な MySQL クエリはどのようになりますか?

編集:

はっきり言って、どのショップがどの在庫を持っているかは問題ありません。私が抱えている問題は、ショップ 1が持っているすべての在庫 +ショップ 1が持って いないすべての在庫を表示することです。
私のクエリ:
SELECT shop, stock.id stock_id, description, amount
FROM stock
LEFT JOIN shop_stock ON shop_stock.stock_id = stock.id

このクエリは次を返します:

|shop|stock_id|description     |amount
--------------------------------------
|1   |1       |Some description|5
|2   |2       |Some description|4
|NULL|3       |Some description|NULL

を追加するWHERE shop <> '2'と、NULLも消えます。ショップ 1の次のテーブルを返すクエリが必要です。

|shop|stock_id|description     |amount
--------------------------------------
|1   |1       |Some description|5
|NULL|2       |Some description|NULL
|NULL|3       |Some description|NULL
4

2 に答える 2

2

内部結合の代わりに外部結合を使用したい。クエリを提供すると、はるかに簡単にわかります。

外部結合を使用している可能性があります。その場合、where 句の条件は、stocks実際に一致する必要があります。NULL <> 2true ではなく falseと評価されることに注意してください。

これを修正するには、on句に条件を入れます。

ショップと在庫の完全な全体像を取得するには、すべての組み合わせを生成するドライバー テーブルを使用し、これを金額に結合します。

select name, stock_description, coalesce(sa.stock_amount, 0) as stock_amount
from (select shop.id as shop_id, shop.name, stock.id as stock_id, stock.stock_description
      from shop cross join stock
     ) ss left outer join
     stockamount sa
     on sa.shop_id = ss.shop_id and sa.stock_id = ss.shop_id

2 を除外する場合は、ss テーブルでこれを行います。

select name, stock_description, coalesce(sa.stock_amount, 0) as stock_amount
from (select shop.id as shop_id, shop.name, stock.id as stock_id, stock.stock_description
      from shop cross join stock
      where stock.id <> 2
     ) ss left outer join
     stockamount sa
     on sa.shop_id = ss.shop_id and sa.stock_id = ss.shop_id
于 2013-03-29T22:47:57.953 に答える
1

Amountsの外積で左結合を行いたいと思います。これにより、各ショップに存在しない在庫エントリに必要な null 値が生成されます。ShopStock

SELECT Shop.*, Stock.*, Amounts
FROM Shop
CROSS JOIN Stock
LEFT JOIN Amounts
ON Shop.id = shop_id
AND Stock.id = stock_id
于 2013-03-29T23:32:27.707 に答える