【发布时间】:2021-07-20 07:20:02
【问题描述】:
我们正在为名为 readoutprobes 和 readoutprobekits 的物品创建一个库存系统。下面的架构被简化了,使用了items和itemkits这两个词。
itemkit,是一个或多个项目的预定义集合,即一个工具包。在套件中,特定类型的物品只能出现一次。一个套件,通常包含约 40 件物品。 itemkit_item 表捕获了套件中项目的定义。套件的库存记录在 itemkit_containers 表中。
itemkit_container 不跟踪物理物品容器。相反,它假设一个物理项目包是正确“组装”的,使用一组物理项目,但我们不知道是哪些。填充后,itemkit_containers 记录中的“填充”字段设置为 true。
items 的库存由 item_containers 表跟踪。它的存在由容器卷监控。当volume为0时,容器被认为是空的。
从 item_container 表中获取特定项目的体积 > 0 的物理项目容器的计数,对于套件也是如此
我们希望为每个项目获得一个“保留计数”编号,以反映套件库存。
例如,假设我们有一个名为 A 的项目,其计数为 42。如果我们正在创建一个包含名为 A 的项目和一个相应的 itemkit_container 的 itemkit,我们希望“reserved”的计数为 1 , 对于项目 A。
项目的“主查询”如下所示:
SELECT items.*,
ic.item_count
FROM items
LEFT JOIN (
SELECT p.id, COUNT(*) item_count, ic.item_id
FROM items AS p, item_containers AS ic
WHERE p.id = ic.item_id AND ic.volume > 0
GROUP BY p.id
) AS ic
ON ic.item_id = items.id
GROUP BY items.id
ORDER BY items.id;
项目表中的数据:
item_containers 表中的数据:
itemkits 表中的数据:
itemkit_item 表中的数据:
以及itemkit_containers中的数据:
可以看出,itemkit 及其库存的唯一记录包含项目 ID = {1,3}的项目
这个问题是要找出如何查询“免费”(或保留)物理项目的数量,即 item_containers 库存,在任何一个时间点。
上面的查询,返回这个结果:
我们想要一个额外的字段,指示每个项目的“保留”计数,反映项目和 itemkits 的实际库存状态。
对于上面的数据,这将是
A -> Reserved = 1
B -> Reserved = 0
C -> Reserved = 1
D -> Reserved = 0
创建和填充上述表格的 db fiddle 在这里: DB Fiddle
我们使用的是 MySQL 8.0。
注意:下面的答案接近正确。但是,它不会将 item_containers(实际库存)与 itemkit_container 记录相关联,而是将 itemkit 记录相关联。通过将 itemkit_containers 表中的填充字段切换为“0”,这一点变得清晰。即:
即使不再填充套件,输出也会显示相同的“保留”计数。在这种情况下,保留应等于“0”。 这是该案例的小提琴:Fiddle where Reserved should be all '0'
【问题讨论】:
-
为所有表提供 CREATE TABLE,一些示例数据作为 INSERT INTO 和期望的结果。
-
@Akina 我用表格和数据更新了问题。我也简化了措辞。用于创建和填充表的 SQL 也是问题的一部分。
-
请说明您使用的是哪个版本的mysql。
-
我不明白“填充”列。如果项目 1 有三个容器,体积分别为 0、10、15,那么它有 25 件库存。如果物品 1 是套件 10、套件 20 和套件 30 的一部分,其中套件 10 和 20 被填充而套件 30 没有,那么物品 1 有多少件被保留,多少件是免费的?
-
@Thorsten Kettner。好问题。任何体积 > 0 的物品容器都是“有效的”并且可以成为套件的一部分。体积 > 0 的项目容器被计为“1”,无论其体积如何。在 kit_containers 表中找到的填充标志表示套件已“填充”,并带有相关的物品容器。但是,填充套件不会显示使用了哪个物品容器,只会显示其类型。
标签: mysql sql inventory dbexpress sqlfiddle