Сортировать плоский список по группам

0

У меня есть плоский список страниц в таблице mySQL.

ID    | Tab index | Page Name | parent 

Страницы могут быть дочерними страницами другой страницы, заданной свойством "parent".

Весь список сортируется с использованием столбца int index.

Может кто-нибудь подумать о способе запросить этот список, чтобы

  • Элементы упорядочиваются Tabindex

  • Элементы, являющиеся дочерними элементами другого элемента, группируются за родительским элементом и упорядочены по их вкладкам (необязательно)?

Знание mySQL не доходит до глубины.

Это существующая структура данных и не может быть изменена.

Заранее благодарим за любой ввод.

  • 0
    Если я правильно понимаю, вы хотите, чтобы дочерние элементы были перечислены сразу после родителя? Или это нормально, чтобы перечислить их где-нибудь после родителя, как журнал, как они сгруппированы?
Теги:
order
treeview

2 ответа

1
Лучший ответ

Предполагая, что столбцы 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", который является первым ненулевым значением следующего:

  • TabIndex
  • родительский tabindex
  • 0

Это позволяет оставить дочерние tabindexes пустыми и наследовать их от родителя. Кроме того, если вы хотите, чтобы значение сортировки по умолчанию было нажато вниз, вы можете заменить 0 (третий arg в coalesce) с помощью (выберите max (tabindex) + 1 со страницы). Единственное предостережение в том, что если дочерний tabindex больше, чем следующий родительский, он появится позже в списке.

0

Если ваши страницы имеют только вложенные 1 уровень глубины, вы можете сделать ... ORDER BY CASE WHEN parent IS NULL THEN id ELSE parent END, parent, tab_id. Для достижения такого же результата с несколькими уровнями вложенности вам понадобятся рекурсивные запросы, для которых MySQL не поддерживает.

  • 0
    Выглядит отлично, завтра попробую и выложу отзывы. Благодарю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню