Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL通配符和子选择计数_Postgresql - Fatal编程技术网

PostgreSQL通配符和子选择计数

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

有两个表,inventory和lots,我使用inventory表保存项目描述,如果项目也包括类别,则通过字段inventory.type作为inventory.type='isInventoryItem'或inventory.type='variation'和inventory.invid作为文本进行过滤,并使用lots表保存批次

    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