获取未定义的连接值

时间:2013-03-29 22:43:21

标签: php mysql

我有3个表:商店表,库存表和stock_amounts表。商店表定义每个商店的详细信息,库存表定义所有库存商品,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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我认为您希望在Amounts上使用ShopStock的叉积进行左连接,这将在不存在的库存条目上生成所需的空值对于每个商店。:

SELECT Shop.*, Stock.*, Amounts
FROM Shop
CROSS JOIN Stock
LEFT JOIN Amounts
ON Shop.id = shop_id
AND Stock.id = stock_id