如何在 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