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

Posted

技术标签:

【中文标题】选择所有产品并通过子类别加入主类别(未知级别)【英文标题】:select all products and join main category through sub-categories (unknown level) 【发布时间】:2016-10-07 04:44:21 【问题描述】:

我有两张桌子

类别

id - 名称 - 父母 1 - A 类 - 0 2 - B 类 - 0 3 - C 类 - 0 4 - D 类 - 0 5 - 1 - 1 的子类别 6 - 5 - 5 的子类别 7 - 5 - 5 的子类别

产品

id - 名称 - 类别 - 描述 1 - 名称 - 5 - 描述

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

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

WITH RECURSIVE category_child AS ( SELECT * FROM categories as c WHERE c.id = 5 联合所有 从类别中选择 c2.* 作为 c2 加入 category_child 作为 c3 ON c3.parent_id = c2.id )

最好的方法是什么?

预期结果

id - 名称 - 类别 - 描述 - 根 - 子类别 id 1 - 子类别 id 2 - 子类别 id 3

id - 名称 - 类别 - 描述 - 根 id - 名称 - 类别 - 描述 - 子类别 id 1 id - 名称 - 类别 - 描述 - 子类别 id 2 id - 名称 - 类别 - 描述 - 子类别 id 3

【问题讨论】:

我不清楚你想要什么输出。请edit您的问题和基于您的样本数据的预期输出。 Formatted 文本 请no screen shots @a_horse_with_no_name 谢谢我已经添加了我的预期结果。 【参考方案1】:

由于您想要一个类别的完整路径,您不能以 c.id = 5 开始您的非递归部分,您必须使用 where parent_id is 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

【讨论】:

以上是关于选择所有产品并通过子类别加入主类别(未知级别)的主要内容,如果未能解决你的问题,请参考以下文章

使用PHP删除类别的所有子级别

所有产品(类别和子类别产品)都计入 magento 中的类别列表页面

woocommerce-如何仅在商店页面上显示子类别?

如何处理角度5递归未知确切数字路由器参数?

xml Miva - 使用产品主图像的CTGY子类别图像

Woocommerce 显示每个类别及其产品