В прошлом задании мы построили иерархию каталогов товаров:

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 /Цифровая техника/Ноутбуки и аксессуары/Рюкзаки

10.6 Строим иерархию объектов

10.8 Сортировка (плохая)