Sortowanie poddrzewa w strukturze danych hierarchicznych tabeli zamknięcia

Chciałbym prosić o pomoc w rozwiązaniu problemu hierarchicznej struktury danych przechowywanej jakostół zamykający.

Chciałem użyć tej struktury do przechowywania menu mojej strony. Wszystko działa dobrze, ale problem polega na tym, że nie wiemjak posortować dokładne poddrzewo w niestandardowym porządku. W tej chwili drzewo jest sortowane w kolejności, w jakiej elementy zostały dodane do bazy danych.

Moja struktura jest oparta naArtykuł Billa Karwina o tabelach zamknięcia i niektórych innych postach.

Oto moja struktura bazy danych MySQL z niektórymi danymi DEMO:

--
-- Table `category`
--

CREATE TABLE IF NOT EXISTS `category` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) COLLATE utf8_czech_ci NOT NULL,
  `active` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;


INSERT INTO `category` (`id`, `name`, `active`) VALUES
(1, 'Cat 1', 1),
(2, 'Cat 2', 1),
(3, 'Cat  1.1', 1),
(4, 'Cat  1.1.1', 1),
(5, 'Cat 2.1', 1),
(6, 'Cat 1.2', 1),
(7, 'Cat 1.1.2', 1);

--
-- Table `category_closure`
--

CREATE TABLE IF NOT EXISTS `category_closure` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `ancestor` int(11) DEFAULT NULL,
  `descendant` int(11) DEFAULT NULL,
  `depth` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_category_closure_ancestor_category_id` (`ancestor`),
  KEY `fk_category_closure_descendant_category_id` (`descendant`)
) ENGINE=InnoDB;

INSERT INTO `category_closure` (`id`, `ancestor`, `descendant`, `depth`) VALUES
(1, 1, 1, 0),
(2, 2, 2, 0),
(3, 3, 3, 0),
(4, 1, 3, 1),
(5, 4, 4, 0),
(7, 3, 4, 1),
(8, 1, 4, 2),
(10, 6, 6, 0),
(11, 1, 6, 1),
(12, 7, 7, 0),
(13, 3, 7, 1),
(14, 1, 7, 2),
(16, 5, 5, 0),
(17, 2, 5, 1);

Oto moje zapytanie SELECT dla jednego drzewa:

SELECT c2.*, cc2.ancestor AS `_parent`
FROM category AS c1
JOIN category_closure AS cc1 ON (cc1.ancestor = c1.id)
JOIN category AS c2 ON (cc1.descendant = c2.id)
LEFT OUTER JOIN category_closure AS cc2 ON (cc2.descendant = c2.id AND cc2.depth = 1)
WHERE c1.id = __ROOT__ AND c1.active = 1
ORDER BY cc1.depth

W przypadku instancji DEMO z __ROOT_ = 1 zapytanie to otrzymuje:

id  name        active     _parent
1   Cat 1       1          NULL
3   Cat 1.1     1          1
6   Cat 1.2     1          1
4   Cat 1.1.1   1          3
7   Cat 1.1.2   1          3

Ale co, jeśli na przykład muszę zmienić kolejność Cat 1.1 i Cat 1.2 (według nazwy lub zamówienia niestandardowego)?

Widziałem kilka rozwiązań nawigacyjnych (jak sortować według okruchów chleba), ale nie wiem, jak je wygenerować i zmienić.

questionAnswers(1)

yourAnswerToTheQuestion