问题:对于数据库中存在的 location_id,但在 tbl_inventory 中没有分配给它们的任何项目,我无法让数据库返回 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
我不确定这里实际发生了什么(在更糟糕的 block 中) - 但是我已经手动计数并且原始查询返回正确的计数我只是无法让它描绘 的位置事实上,它们存在于数据库中,但实际上没有分配给它们的任何项目。
有人有任何见解吗?我发现的所有修复都还没有起作用。
最佳答案
移动
WHERE tbl_inventory.shop_id = 110
连接条件的条件
ON tbl_location.location_id = tbl_inventory.location_id
AND tbl_inventory.shop_id = 110
在您的 FROM
和 LEFT JOIN
子句起作用后 - 那里有一行带有 0
的行,但是 WHERE
> 将其过滤掉,因为该行中没有 tbl_inventory.shop_id = 110
PS:在选择中应该是tbl_location.location_id
,而不是tbl_inventory.location_id
关于MySQL 计数不会与我的其余数据一起返回空计数。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15401054/