如何在 sql 中从上到下获取分层类别产品
How to get a hierarchical category products from top to down in sql
我使用 parentid 逻辑保留产品类别。我需要将所有产品放在一个类别下,但从上到下的层次结构。例如我有这些表:
产品类别
id CategoryID ProductID
1 4 1
2 5 2
3 6 3
4 8 4
5 8 5
6 9 5
7 9 2
类别
ID CategoryName ParentID
1 Kids NULL
2 Accesories 1
3 Shoes 2
4 Flat Shoes 3
5 Leather Sandals 4
6 Sneakers 3
7 Clothing 1
8 T-Shirts 7
9 Bestsellers 1
产品
ID ProductName
1 White Espadrilles
2 Tan Leather Sandals
3 Beige Sneakers
4 Linen T-Shirt
5 Cotton T-Shirt
我在下面使用 Sql 递归查询:
with CTE as
(
select c.ID,c.ParentID,c.CategoryName,p.ProductName
from Categories c
join ProductCategories pc
on pc.CategoryID=c.ID
join Products p
on pc.ProductID=p.ID
where c.ID = 5 --start id
union all
select ce.ID,ce.ParentID,ce.CategoryName,p.ProductName
from Categories ce
join ProductCategories pc
on pc.CategoryID=ce.ID
join Products p
on pc.ProductID=p.ID
join CTE
on ce.ID=CTE.ParentID
)
select * from CTE
上面的查询 returns 下面的结果对于给定的 CategoryID = 5 :
ID ParentID CategoryName ProductName
5 4 Leather Sandals Tan Leather Sandals
4 3 Flat Shoes White Espadrilles
如果 categoryID = 1 或 2 则没有记录。
我没有直接用于配件类别的产品,但我有它的子类别,所以我应该从上到下获取该类别下的所有产品。
我该怎么做?
你不说你用的是哪个数据库,我给你一个通用的解决方案。
您可以使用递归 CTE 生成类别列表,其中包括起始类别及其所有子项(在多个级别)。然后简单的连接将完成剩下的工作,正如您已经尝试过的那样。
举个例子。根据需要针对您的特定数据库进行调整:
with
categories_subtree as (
select id, categoryname, parentid
from categories
where id = 5 -- starting category
union all
select c.id, c.categoryname, c.parentid
from categories_subtree s
join categories c on c.parentid = s.id
)
select
p.id,
c.parentid
c.categoryname,
p.productname
from categories_subtree c
join productcategories pc on pc.categoryid = c.id
join products p on p.id = pc.productid
我使用 parentid 逻辑保留产品类别。我需要将所有产品放在一个类别下,但从上到下的层次结构。例如我有这些表:
产品类别
id CategoryID ProductID
1 4 1
2 5 2
3 6 3
4 8 4
5 8 5
6 9 5
7 9 2
类别
ID CategoryName ParentID
1 Kids NULL
2 Accesories 1
3 Shoes 2
4 Flat Shoes 3
5 Leather Sandals 4
6 Sneakers 3
7 Clothing 1
8 T-Shirts 7
9 Bestsellers 1
产品
ID ProductName
1 White Espadrilles
2 Tan Leather Sandals
3 Beige Sneakers
4 Linen T-Shirt
5 Cotton T-Shirt
我在下面使用 Sql 递归查询:
with CTE as
(
select c.ID,c.ParentID,c.CategoryName,p.ProductName
from Categories c
join ProductCategories pc
on pc.CategoryID=c.ID
join Products p
on pc.ProductID=p.ID
where c.ID = 5 --start id
union all
select ce.ID,ce.ParentID,ce.CategoryName,p.ProductName
from Categories ce
join ProductCategories pc
on pc.CategoryID=ce.ID
join Products p
on pc.ProductID=p.ID
join CTE
on ce.ID=CTE.ParentID
)
select * from CTE
上面的查询 returns 下面的结果对于给定的 CategoryID = 5 :
ID ParentID CategoryName ProductName
5 4 Leather Sandals Tan Leather Sandals
4 3 Flat Shoes White Espadrilles
如果 categoryID = 1 或 2 则没有记录。
我没有直接用于配件类别的产品,但我有它的子类别,所以我应该从上到下获取该类别下的所有产品。
我该怎么做?
你不说你用的是哪个数据库,我给你一个通用的解决方案。
您可以使用递归 CTE 生成类别列表,其中包括起始类别及其所有子项(在多个级别)。然后简单的连接将完成剩下的工作,正如您已经尝试过的那样。
举个例子。根据需要针对您的特定数据库进行调整:
with
categories_subtree as (
select id, categoryname, parentid
from categories
where id = 5 -- starting category
union all
select c.id, c.categoryname, c.parentid
from categories_subtree s
join categories c on c.parentid = s.id
)
select
p.id,
c.parentid
c.categoryname,
p.productname
from categories_subtree c
join productcategories pc on pc.categoryid = c.id
join products p on p.id = pc.productid