В версиях, предшествующих MySQL 8, рекурсивные запросы сложны.В вашем случае кажется, что у вас есть только 3 уровня (0, 1 и 2), так что лучше просто самостоятельно подключаться к вашей таблице столько раз, чтобы получить пути от корня к каждому узлу.
Наконец, сортировка по объединению имен в «пути» от корня до потомка:
select a.cat_id, a.cat_level, a.cat_name,
concat(
ifnull(concat(c.cat_name, ' '), ''),
ifnull(concat(b.cat_name, ' '), ''),
a.cat_name) as cat_order
from ticket_categories a
left join ticket_categories b on b.cat_id = a.cat_parent_id
left join ticket_categories c on c.cat_id = b.cat_parent_id
order by cat_order;
Вы можете легко расширить этот запрос для поддержки большего количества уровней;просто добавьте столько left join
строк и псевдонимов таблиц и соответственно расширьте выражение concat
.
В MySQL 8 вы можете использовать рекурсивный запрос, который может обрабатывать любое количество уровней:
with recursive cte(cat_id, cat_level, cat_name, cat_order) as (
select cat_id, cat_level, cat_name, cat_name
from ticket_categories
where cat_parent_id = 0
union
select t.cat_id, t.cat_level, t.cat_name, concat(cte.cat_order, ' ', t.cat_name)
from cte
inner join ticket_categories t on t.cat_parent_id = cte.cat_id
)
select * from cte
order by cat_order;
Вывод для обоих запросов:
cat_id | cat_level | cat_name | cat_order
-------+-----------+--------------------------------------+-------------------------------------------------------------------------------
3 | 0 | Admin and Facilities | Admin and Facilities
4 | 1 | Safety and Security Related Concerns | Admin and Facilities Safety and Security Related Concerns
9 | 2 | CCTV Footage Request | Admin and Facilities Safety and Security Related Concerns CCTV Footage Request
2 | 0 | Information Technology | Information Technology
5 | 1 | User Account | Information Technology User Account
8 | 2 | Enable / Disable Access | Information Technology User Account Enable / Disable Access
1 | 0 | People and Culture | People and Culture
10 | 1 | Certification | People and Culture Certification
11 | 2 | Certificate of Employment | People and Culture Certification Certificate of Employment
12 | 2 | SSS Certificate of Contributions | People and Culture Certification SSS Certificate of Contributions
В качестве разделителя в пути используется двойной пробел (cat_order
).Это предполагает, что у вас не будет двойных пробелов в ваших именах.В противном случае порядок может оказаться неправильным, если у также есть имена, где один является префиксом другого.
Для окончательного форматирования отступа вы должны использовать столбец cat_level
,Но, на мой взгляд, такая задача не относится к SQL, хотя ее легко выполнить с
concat(repeat(' ', cat_level), cat_name)
A db fiddle для обоих запросов.