我有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
答案 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
上使用Shop
和Stock
的叉积进行左连接,这将在不存在的库存条目上生成所需的空值对于每个商店。:
SELECT Shop.*, Stock.*, Amounts
FROM Shop
CROSS JOIN Stock
LEFT JOIN Amounts
ON Shop.id = shop_id
AND Stock.id = stock_id