У меня есть плоский список страниц в таблице mySQL.
ID | Tab index | Page Name | parent
Страницы могут быть дочерними страницами другой страницы, заданной свойством "parent".
Весь список сортируется с использованием столбца int index.
Может кто-нибудь подумать о способе запросить этот список, чтобы
Элементы упорядочиваются Tabindex
Элементы, являющиеся дочерними элементами другого элемента, группируются за родительским элементом и упорядочены по их вкладкам (необязательно)?
Знание mySQL не доходит до глубины.
Это существующая структура данных и не может быть изменена.
Заранее благодарим за любой ввод.
Предполагая, что столбцы id, pagename, tabindex, parent_id
select *,
coalesce(
tabindex,
(select p2.tabindex from page as p2 where p2.id = p.parent_id limit 1),
0
) as ti
from page as p
order by coalesce(ti, p.tabindex)
;
вернет эти столбцы в порядке "ti", который является первым ненулевым значением следующего:
Это позволяет оставить дочерние tabindexes пустыми и наследовать их от родителя. Кроме того, если вы хотите, чтобы значение сортировки по умолчанию было нажато вниз, вы можете заменить 0 (третий arg в coalesce) с помощью (выберите max (tabindex) + 1 со страницы). Единственное предостережение в том, что если дочерний tabindex больше, чем следующий родительский, он появится позже в списке.
Если ваши страницы имеют только вложенные 1 уровень глубины, вы можете сделать ... ORDER BY CASE WHEN parent IS NULL THEN id ELSE parent END, parent, tab_id
. Для достижения такого же результата с несколькими уровнями вложенности вам понадобятся рекурсивные запросы, для которых MySQL не поддерживает.