Как получить иерархическую категорию товаров сверху вниз в sql - PullRequest
0 голосов
/ 18 мая 2019

Я держу товарные категории с парентидной логикой.Мне нужно, чтобы все продукты были отнесены к категории, но сверху вниз.Например, у меня есть эти таблицы:

ProductCategories

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

Приведенный выше запрос возвращает приведенный ниже результат для данного CategoryID = 5:

ID     ParentID     CategoryName      ProductName
5      4            Leather Sandals   Tan Leather Sandals
4      3            Flat Shoes        White Espadrilles

, если categoryID = 1 или 2, никаких записей не происходит.

У меня нетпродукт напрямую для категории Аксесуары, но я имею в виду его дочерние категории, поэтому я должен получить все продукты под этим, сверху вниз.

Как я могу это сделать?

1 Ответ

0 голосов
/ 18 мая 2019

Вы не говорите, какую базу данных вы используете, поэтому я дам вам общее решение.

Вы можете использовать рекурсивный 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
...