Теперь, когда мы научились строить путь до элемента, можем отсортировать строки, чтобы дочерние элементы одного родителя находились рядом и были отсортированы между собой.
Отсортируем строки по пути до элемента:
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
ORDER BY path
# | category_id | parent_category_id | name | level | path |
---|---|---|---|---|---|
1 | 1 | NULL | Товары для дома | 1 | /Товары для дома |
2 | 3 | 1 | Бытовая техника | 2 | /Товары для дома/Бытовая техника |
3 | 2 | NULL | Цифровая техника | 1 | /Цифровая техника |
4 | 7 | 2 | Аудиотехника | 2 | /Цифровая техника/Аудиотехника |
5 | 6 | 2 | Игровые консоли | 2 | /Цифровая техника/Игровые консоли |
6 | 4 | 2 | Ноутбуки и аксессуары | 2 | /Цифровая техника/Ноутбуки и аксессуары |
7 | 9 | 4 | Ноутбуки | 3 | /Цифровая техника/Ноутбуки и аксессуары/Ноутбуки |
8 | 10 | 4 | Рюкзаки | 3 | /Цифровая техника/Ноутбуки и аксессуары/Рюкзаки |
9 | 8 | 2 | Сотовые телефоны | 2 | /Цифровая техника/Сотовые телефоны |
10 | 5 | 2 | Фотоаппараты | 2 | /Цифровая техника/Фотоаппараты |
P.S. Такая сортировка не является надежной! Читай дальше)