当前位置: 首页 > 知识库问答 >
问题:

当产品在子类别中时,选择每个类别的产品数量

伊俊能
2023-03-14

这是一个产品的表格结构

PROD_ID     CATEG_ID
1           2
2           21
3           211
4           5
5           51

这是类别的表结构

CATEG_ID    PARENT_CATEG_ID
2           NULL
5           NULL
21          2
211         21
51          5

我在为包括嵌套类别在内的每个类别选择产品计数时遇到困难。例如,类别2有1个产品,类别21有1个产品,类别211有1个产品,并且由于类别21221是类别2的各自直接/间接祖先,类别2有3个产品。所以我需要一个查询或只是一种方法来获得这样的东西:

CATEG_ID    PARENT_CATEG_ID    PRODUCT_COUNT
2           NULL               3   (including product count for categories 21 and 221)
5           NULL               2   (including product count for category 51)
21          2                  2   (including product count for category 221)
211         21                 1   (no category ancestor, only product count for self)
51          5                  1   (no category ancestor, only product count for self) 

是否可以只使用SQL,或者我需要添加一些PHP?

共有2个答案

蒋默
2023-03-14

在这里,我们检查c1.categ是否具有子类别,并借助从自身开始的递归查询,该查询通过在其下构建树来获取所有子类别ID。如果是这样,那么它还会将产品计入子类别下

select c1.categ_id,c1.parent_categ_id,count(prods.prod_id)
as product_count from categ c1
join prods on prods.categ_id=c1.categ_id or prods.categ_id
in( with recursive tree(id,parent_id)as 
(select categ_id,parent_categ_id from categ 
where categ_id=c1.categ_id  
union all
select cat.categ_id,cat.parent_categ_id from categ cat
join tree on tree.id=cat.parent_categ_id) select id from tree)
group by c1.categ_id,c1.parent_categ_id order by product_count

结果如下

+----------+-----------------+---------------+
| categ_id | parent_categ_id | product_count |
+----------+-----------------+---------------+
|       51 |               5 |             1 |
|      211 |              21 |             1 |
|        5 |            NULL |             2 |
|       21 |               2 |             2 |
|        2 |            NULL |             3 |
+----------+-----------------+---------------+
蔚元明
2023-03-14

下面应该可以做到:

with recursive cat as (
  select categ_id, 
         parent_categ_id,
         categ_id as root_category, 
         1 as level
  from categories
  where parent_categ_id is null
  union all
  select c.categ_id,
         c.parent_categ_id,
         p.root_category,
         p.level + 1
  from categories c
    join cat as p on p.categ_id = c.parent_categ_id
)
select c.categ_id, 
       p.prod_id,
       (select count(*) from cat c2 where c2.level >= c.level and c2.root_category = c.root_category) as cnt
from cat c
  left join products p on p.categ_id = c.categ_id
;

递归查询首先构建整个类别树。它返回每个类别的根类别,以及该类别在特定根类别的子树中的嵌套级别。CTE自己也是这样回答的:

categ_id | parent_categ_id | root_category | level
---------+-----------------+---------------+------
       2 |          (null) |             2 |     1
      21 |               2 |             2 |     2
     211 |              21 |             2 |     3
       5 |          (null) |             5 |     1
      51 |               5 |             5 |     2

然后,这用于连接产品表并对包含在同一根类别中的产品进行运行和(即count(p.prod_id)over(c.root分区_category级别desc顺序)部分)。所以完整查询的结果是这样的:

categ_id | prod_id | product_count
---------+---------+--------------
       2 |       1 |             3
      21 |       2 |             2
     211 |       3 |             1
       5 |       4 |             2
      51 |       5 |             1

SQLFiddle:http://sqlfiddle.com/#!15/d6261/15

 类似资料:
  • 我有一个名为“产品类型”的WooCommerce产品类别,我试图列出该类别下的所有类别,但不是这些类别的子类别。例如,我有: 产品类型 碳化物米尔斯 钓鱼工具 儿童类别 我希望它列出“电石磨坊”和“打捞工具”,但不是“儿童类别”。 这是我的代码: 但它仍然返回“儿童类别”。我不知道为什么将深度限制为“1”并将“include_children”设置为“false”不能解决这个问题。

  • 我正在与woocommerce建立电子商务网站。我在父类别下划分了子类别。我上传每个子类别的产品,不仅选择子类别,还选择父类别。但是,当我单击父类别时,我看不到任何产品。我只能在子类别中看到。例如,我有“手表”

  • 希望你能帮我解决这个问题。我有一个问题,一些产品在子类别404'ing当去那里的产品页面。但奇怪的是,我在谷歌上找不到的只是他们中的一些人在做这件事。 实例 SKU:产品1--类别:类别1 SKU:产品2--类别:类别2,子类别1 SKU:Product3--类别:类别2,子类别1 SKU:Product4--类别:类别2,子类别1 将显示Product1、Product2、Product4。带有

  • 问题内容: 我有这样的查询 现在,在我的查询中,我想获得每个类别的前10个产品(按销售量排名最高),并且每个类别我需要前5个子类别(按销售量排名前列) 您可以假设问题陈述是这样的: 按销售获得每个类别的前10个产品,按销售获得每个5个子产品。 这里的类别可以是书籍 产品可以是Harry Porter的书 子产品可以是HarryPorter系列5 样本输入数据格式 输出将是“ 我的查询失败,因为结果

  • 我的数据库中有两个表: 我怎么能这样回报: 我在类别表中使用“WITH RECURSIVE”,但找不到将产品表与1次查询相结合的方法。我使用这里的例子 最好的方法是什么?

  • 问题内容: 我有一个包含一个类别的FK的产品表,创建类别表的方式是每个类别都可以有一个父类别,例如: 我需要进行选择查询,如果选择的类别是“处理器”,它将返回英特尔,奔腾,Core 2 Duo,AMD等产品。 我考虑过要创建某种“缓存”,该缓存将为数据库中的每个类别存储层次结构中的所有类别,并在where子句中包含“ IN”。这是最好的解决方案吗? 问题答案: 最好的解决方案是在数据库设计阶段。您