选择所有产品并通过子类别加入主类别(未知级别)
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
【讨论】:
以上是关于选择所有产品并通过子类别加入主类别(未知级别)的主要内容,如果未能解决你的问题,请参考以下文章