0

我有 3 个表:一个 shop 表、一个 stock 表和一个 stock_amounts 表。shop 表定义了每个商店的详细信息,stock 表定义了所有库存商品,stock_amounts 表定义了每个商店的商品库存量。

我的表如下所示:

*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 有 5 个库存 1,但没有库存 2 或库存 3。我希望库存 2 和 3 显示为零或 NULL 值。

我目前正在一起加入。如果我没有在WHERE子句中指定任何内容,则会显示所有带有库存的商店,并为未定义的值显示 NULL。如果我这样做WHERE stock_amounts.id <> '2'了,那么所有 NULL 值都不再显示。

我想知道的是:
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 也会消失。我想要一个查询,它将返回shop 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 <> 2评估结果为假,而不是真。

您可以通过将条件放在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

我认为您想使用 and 的叉积进行左连接,Amounts这将在每个商店都不存在的库存条目上产生所需的空值。: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 回答