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

选择所有产品并通过子类别(未知级别)加入主类别

鲁望
2023-03-14

我有2张桌子

类别

id - name - parent
1 - Category A - 0
2 - Category B - 0
3 - Category C - 0
4 - Category D - 0
5 - Subcategory Of 1 - 1
6 - Subcategory Of 5 - 5
7 - Subcategory Of 5 - 5

产品

id - name - category - description
1  - Name - 5 - Description

如何选择所有产品并通过子类别加入主类别?产品类别只能有1或2或3或4个级别(未知级别)。

我在类别表中使用“with RECURSIVE”,但找不到将产品表与1次查询相结合的方法

WITH RECURSIVE category_child AS 
(
    SELECT * FROM categories as c WHERE c.id = 5
    UNION ALL
    SELECT c2.* FROM categories AS c2
    JOIN category_child as c3 ON c3.parent_id = c2.id
)

最好的方法是什么?

预期结果

id - name - category - description - root - sub category id 1 - sub category id 2 - sub category id 3

id - name - category - description - root
id - name - category - description - sub category id 1
id - name - category - description - sub category id 2
id - name - category - description - sub category id 3 

共有1个答案

阎善
2023-03-14

当您想要类别的完整路径时,您不能以c.id=5开始您的非递归部分,您必须使用从根开始,其中parent_id为null(您不应该使用不存在的类别ID识别根节点,这会阻止为parent_id列创建正确的外键)。

在递归部分,您可以聚合根类别的完整路径:

with recursive tree as 
(
  select *, id as root_category, concat('/', name) as category_path
  from category
  where parent_id is null
  union all
  select c.*, p.root_category, concat(p.category_path, '/', c.name)
  from category c
    join tree p on c.parent_id = p.id
)
select p.id as product_id,
       p.name as product_name,
       t.root_category,
       t.category_path
from tree t
  join product p on p.category = t.id

使用以下示例数据:

create table category (id integer, name text, parent_id integer);
create table product (id integer, name text, category integer, description text);

insert into category
values
(1, 'Category A', null),
(2, 'Category B', null),
(3, 'Category C', null),
(4, 'Category D', null),
(5, 'Subcategory Of 1', 1),
(6, 'Subcategory Of 5', 5),
(7, 'Subcategory Of 5', 5),
(8, 'Subcategory of D', 4)
;

insert into product
values
(1, 'Product One', 5, 'Our first product'),
(2, 'Product Two', 8, 'The even better one');

这将返回:

product_id | product_name | root_category | category_path               
-----------+--------------+---------------+-----------------------------
         1 | Product One  |             1 | /Category A/Subcategory Of 1
         2 | Product Two  |             4 | /Category D/Subcategory of D
 类似资料:
  • 我的数据库中有两个表: 我怎么能这样回报: 我在类别表中使用“WITH RECURSIVE”,但找不到将产品表与1次查询相结合的方法。我使用这里的例子 最好的方法是什么?

  • 这是一个产品的表格结构 这是类别的表结构 我在为包括嵌套类别在内的每个类别选择产品计数时遇到困难。例如,类别有1个产品,类别有1个产品,类别有1个产品,并且由于类别和是类别的各自直接/间接祖先,类别有3个产品。所以我需要一个查询或只是一种方法来获得这样的东西: 是否可以只使用SQL,或者我需要添加一些PHP?

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

  • 我有两个表格;类别和产品。对于每个类别,我想计算其所有子类别中有多少产品。我已经计算了每个类别中有多少。示例表是: 类别: 产品: 所以我想让我的函数: 它只需要作为选择查询,无需更新数据库。 有什么想法吗? 编辑:SQL小提琴:http://sqlfiddle.com/#!2/1941a/4/0

  • 我正在尝试将产品类别添加到电子邮件通知中。自定义字段(时间和日期)起作用,但产品类别显示为“数组”。

  • 我如何从数据库中选择它们来显示类别(表2)中parent_id下的所有产品(表1)? 例如,我想使用像cat.php这样的链接显示/列出parent_id = 1(童装)下的所有产品,包括每页子类别下的所有产品?id=1 父类别ID#1 < li >产品#1 父类别ID#2 产品#5 父类别ID #3 产品#7 这是我到目前为止看到的,但它仍然没有显示父类别sqlfiddle中的所有产品 DB:类