В прошлом задании мы построили иерархию каталогов товаров:
WITH RECURSIVE lv_hierarchy AS (
SELECT c.category_id,
c.parent_category_id,
c.name,
1 AS level
FROM category c
WHERE c.parent_category_id IS NULL
UNION ALL
SELECT c.category_id,
c.parent_category_id,
c.name,
p.level + 1 AS level
FROM lv_hierarchy p,
category c
WHERE c.parent_category_id = p.category_id
)
SELECT *
FROM lv_hierarchy
# | category_id | parent_category_id | name | level |
---|---|---|---|---|
1 | 1 | NULL | Товары для дома | 1 |
2 | 2 | NULL | Цифровая техника | 1 |
3 | 3 | 1 | Бытовая техника | 2 |
4 | 4 | 2 | Ноутбуки и аксессуары | 2 |
5 | 5 | 2 | Фотоаппараты | 2 |
6 | 6 | 2 | Игровые консоли | 2 |
7 | 7 | 2 | Аудиотехника | 2 |
8 | 8 | 2 | Сотовые телефоны | 2 |
9 | 9 | 4 | Ноутбуки | 3 |
10 | 10 | 4 | Рюкзаки | 3 |
Отобразим путь до каталога (так называемые "хлебные крошки"). Например, для ноутбуков должно получиться
/Цифровая техника/Ноутбуки и аксессуары/Ноутбуки
Для "Ноутбуки и аксессуары":
/Цифровая техника/Ноутбуки и аксессуары
С помощью рекурсивных запросов построить такой путь довольно просто. Для родительских каталогов (получаем их в нерекурсивной части подзапроса) путь равен
/ + название каталога
Для вложенных каталогов (в рекурсивной части подзапроса):
путь до родителя + / + название каталога
Доработаем наш запрос по вышеизложенному алгоритму:
WITH RECURSIVE lv_hierarchy AS (
SELECT c.category_id,
c.parent_category_id,
c.name,
1 AS level,
'/' || c.name AS path
FROM category c
WHERE c.parent_category_id IS NULL
UNION ALL
SELECT c.category_id,
c.parent_category_id,
c.name,
p.level + 1 AS level,
p.path || '/' || c.name AS path
FROM lv_hierarchy p,
category c
WHERE c.parent_category_id = p.category_id
)
SELECT *
FROM lv_hierarchy
# | category_id | parent_category_id | name | level | path |
---|---|---|---|---|---|
1 | 1 | NULL | Товары для дома | 1 | /Товары для дома |
2 | 2 | NULL | Цифровая техника | 1 | /Цифровая техника |
3 | 3 | 1 | Бытовая техника | 2 | /Товары для дома/Бытовая техника |
4 | 4 | 2 | Ноутбуки и аксессуары | 2 | /Цифровая техника/Ноутбуки и аксессуары |
5 | 5 | 2 | Фотоаппараты | 2 | /Цифровая техника/Фотоаппараты |
6 | 6 | 2 | Игровые консоли | 2 | /Цифровая техника/Игровые консоли |
7 | 7 | 2 | Аудиотехника | 2 | /Цифровая техника/Аудиотехника |
8 | 8 | 2 | Сотовые телефоны | 2 | /Цифровая техника/Сотовые телефоны |
9 | 9 | 4 | Ноутбуки | 3 | /Цифровая техника/Ноутбуки и аксессуары/Ноутбуки |
10 | 10 | 4 | Рюкзаки | 3 | /Цифровая техника/Ноутбуки и аксессуары/Рюкзаки |