MySQL сортировка по родителям и детям - PullRequest
0 голосов
/ 03 сентября 2018

Вот простая таблица:

id, title, parent, ordering
---------------------------
3242, TitleB, 0, 1
6574, TitleBA, 3242, 1
2346, TitleBB, 3242, 2
2344, TitleA, 0, 1
7346, TitleAC, 2344, 3
3574, TitleAB, 2344, 2
2256, TitleAA, 2344, 1
1435, TitleC, 0, 1
4354, TitleCA, 1435, 1

Я ищу запрос, который может упорядочить и вывести эти строки следующим образом:

TitleA
  TitleAA
  TitleAB
  TitleAC
TitleB
  TitleBA
  TitleBB
TitleC
  TitleCA

Таким образом, строки должны быть упорядочены первым родителем, а затем упорядочены его дочерние элементы Затем следует следующий родитель, затем его дочерние элементы и т. Д.

Заказ самих родителей не имеет значения! Названия только для лучшего понимания и не могут быть использованы для сортировки. Важно то, что дети сортируются под родителями.

Это последний запрос, который я сделал:

SELECT *
FROM table t1
     LEFT JOIN table t2
     ON t2.id = t1.parent 
ORDER BY COALESCE(t1.ordering, t2.ordering), t2.ordering   

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Частичным решением может быть следующий запрос:

SELECT t.title FROM t GROUP BY IF(parent=0,id,parent), 
IF(parent=0,-1,ordering), t.title ORDER BY IF([parent]=0,
id,parent), IF(parent=0,-1,ordering);

Результат выглядит следующим образом:

TitleC
TitleCC
TitleA
TitleAA
TitleAB
TitleAC
TitleB
TitleBA
TitleBB

Чтобы сделать отступ для заголовка каждой группы, можно использовать что-то вроде отчета в MS Access. Я подготовил его в MS Access, поэтому в синтаксисе MySQL могут быть небольшие различия.

0 голосов
/ 03 сентября 2018
SELECT *, if(parent = 0, id, parent) as main_order
FROM `tbl`
ORDER by main_order, ordering, parent

Я думаю, что этот запрос корректно работает для 1-родительского ребенка.

Решение той же проблемы смотрите здесь: порядок иерархии дерева sql

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...