0

问题:我无法让我的数据库为存在于数据库中但没有在 tbl_inventory 中分配任何项目的 location_id 返回 0/NULL。在添加到已分配项目的 location_id 的计数中。

tbl_inventory:(仅发布相关列)

location_id, shop_id, ...
1          | 100
1          | 100
3          | 106
4          | 100
10         | 102
2          | 100

tbl_location:(发布所有列)

location_id, location_desc, shop_id
1          | Shop Stock   | 100
2          | Crash Kit    | 100
3          | Site 4       | 106
4          | Radar Site   | 102
5          | New Location | 100
...
10         | Fire Stn 2   | 100

询问

SELECT
tbl_location.location_desc, 
tbl_inventory.location_id, 
COALESCE(COUNT(tbl_location.location_id), 0) as 'idCnt'
FROM tbl_location 
LEFT OUTER JOIN tbl_inventory
ON tbl_location.location_id = tbl_inventory.location_id
WHERE tbl_inventory.shop_id = 110
GROUP BY tbl_location.location_id;

结果

location_desc, location_id, idCnt
Shop Stock   | 1          | 2
Crash Kit    | 2          | 1
Fire stn 2   | 10         | 1

这里缺少的是来自 tbl_location 的 location_id 5

New Location | 5          | 0 (or Null, because there are none in tbl_inventory)

解释:

我的 tbl_location 是由我们网络中的各个商店分配(和创建)的容器标签表。然后,商店拥有该容器的所有权,并可以将零件分配给它 (tbl_inventory.location_id) 用于库存目的。

我的 PHP 应用程序使用此查询生成可用位置列表,并根据分配给它的项目数量授予选项。如果项目数量为 0,我希望能够删除该位置。

更糟

如果我要删除 GROUP BY,整个查询就会被搞砸。只返回 1 个 location_id/desc 并将整个总数加到该行上。

location_desc, location_id, idCnt
Shop Stock   | 1          | 5

我不确定这里实际发生了什么(在更糟糕的块中) - 但是我已经手动计算并且原始查询返回正确的计数我只是无法让它描绘实际上存在的位置在数据库中,但实际上没有分配任何项目。

任何人有任何见解?我发现的所有修复程序都还没有工作。

4

1 回答 1

2

移动

WHERE tbl_inventory.shop_id = 110

条件加入条件

 ON tbl_location.location_id = tbl_inventory.location_id
AND tbl_inventory.shop_id = 110

在您的FROMandLEFT JOIN子句起作用之后-那里有一行0,但WHERE将其过滤掉,因为tbl_inventory.shop_id = 110该行中没有

PS:在选择它应该是tbl_location.location_id,不是tbl_inventory.location_id

于 2013-03-14T04:12:36.877 回答