Сначала вы хотите, чтобы ваши данные были упорядочены в алфавитном порядке и глубине.
Распространенным решением для этого является обход структуры от верхнего элемента, конкатенация пути к каждому элементу в виде go. Затем вы можете напрямую использовать путь для упорядочения.
Вот как это сделать в MySQL 8.0 с рекурсивным запросом
with recursive cte(venueID, venueName, mainVenueID, path, depth) as (
select v.venueID, v.venueName, cast(null as char(100)), venueName, 0
from tblAdmVenue v
where not exists (select 1 from tblAdmVenueLink l where l.subVenueID = v.venueID)
union all
select v.venueID, v.venueName, c.venueID, concat(c.path, '/', v.venueName), c.depth + 1
from cte c
inner join tblAdmVenueLink l on l.mainVenueID = c.venueID
inner join tblAdmVenue v on v.venueID = l.subVenueID
)
select * from cte order by path
Якорь рекурсивного запроса выбирает верхние узлы ( ie строки, идентификаторы которых не существуют в столбце subVenueID
таблицы ссылок). Затем рекурсивная часть следует за отношениями.
В качестве бонуса я добавил столбец level
, представляющий глубину каждого узла, начиная с 0 для верхних узлов.
Демонстрация на DB Fiddle :
venueID | venueName | mainVenueID | path | depth
:------ | :-------------- | :---------- | :------------------------- | ----:
LA47 | Banquet | <em>null</em> | Banquet | 0
LA43 | Big Room | <em>null</em> | Big Room | 0
LA45 | Room Daisy | LA43 | Big Room/Room Daisy | 1
LA46 | Room Rose | LA43 | Big Room/Room Rose | 1
LA48 | Split 1 | LA46 | Big Room/Room Rose/Split 1 | 2
LA44 | Hall | <em>null</em> | Hall | 0
LA49 | Meeting Room WP | LA44 | Hall/Meeting Room WP | 1