PostgreSQL通配符和子选择计数
有两个表,inventory和lots,我使用inventory表保存项目描述,如果项目也包括类别,则通过字段inventory.type作为inventory.type='isInventoryItem'或inventory.type='variation'和inventory.invid作为文本进行过滤,并使用lots表保存批次PostgreSQL通配符和子选择计数,postgresql,Postgresql,有两个表,inventory和lots,我使用inventory表保存项目描述,如果项目也包括类别,则通过字段inventory.type作为inventory.type='isInventoryItem'或inventory.type='variation'和inventory.invid作为文本进行过滤,并使用lots表保存批次 invid | type Sugraone | Variety Autumn Royal | Variety Flame
invid | type
Sugraone | Variety
Autumn Royal | Variety
Flame | Variety
Summer Royal | Variety
Red Globe | Variety
对于像这样的项目:
invid | type
Sugraone 19#Pouch Free Bird Ctn B | isInventoryItem
Red Globe 21#PlainSO Chelan Starr 7L Sty | isInventoryItem
Flame 19#Pouch SO2 Puro Filete 5L Styro A | isInventoryItem
我希望能够从库存中选择type='variation',并使用like对库存按类别统计批次表中的实例。invid我尝试了以下方法:
SELECT COUNT(inventory.*) AS lots, invid FROM lots
INNER JOIN inventory ON lots.inventory_id = inventory.inventory_id
WHERE invid ILIKE ANY (SELECT '%' || invid || '%'
from inventory WHERE type ='isInventoryItem') GROUP BY invid;
如果未成功,我希望此输出:
invid | count
Sugraone | 5
Autumn Royal | 6
Flame | 3
Summer Royal | 7
Red Globe | 23
这样做的方法是什么
编辑:我添加了一个视图(items\u视图),仅将invid列为已筛选的名称,仅获取要搜索类别的项目列表,以简化操作:
name
我可以得到这样的类别列表:从inventory中选择inid,其中type='Variety',我得到如下列表:
invid
--------------
Sugraone
Autumn Royal
Flame
Summer Royal
Red Globe
现在的问题是,如何使用LIKE在清单中循环列出这个类别的清单,并在清单上进行计数,得到如下结果
invid | count
Sugraone | 1
Autumn Royal | 2
Flame | 3
Summer Royal | 2
Red Globe | 2
您正在使用
类型为'isInventoryItem'
的行的invid
作为模式。相反,使用type='variation'
的行作为模式:
SELECT invid
, COUNT(inventory.*) AS lots
FROM lots
INNER inventory
ON lots.inventory_id = inventory.inventory_id
WHERE inventory.type = 'isInventoryItem'
AND invid ILIKE ANY
(
SELECT '%' || invid || '%'
FROM inventory
WHERE type = 'Variety'
)
GROUP BY
invid
作为一个侧面的注释,考虑学习。您可能应该有一个单独的库存类别表,而不是将这些类别包含在库存表中。您拥有一个类别表是绝对正确的,遗憾的是,设计不合理。为了清晰起见,我对问题进行了编辑,我想通过你的回答和一些变通办法,我找到了满足标准的方法,但我仍然没有找到一种方法
SELECT invid
, COUNT(inventory.*) AS lots
FROM lots
INNER inventory
ON lots.inventory_id = inventory.inventory_id
WHERE inventory.type = 'isInventoryItem'
AND invid ILIKE ANY
(
SELECT '%' || invid || '%'
FROM inventory
WHERE type = 'Variety'
)
GROUP BY
invid