Chciałbym prosić o pomoc w rozwiązaniu problemu z hierarchiczną strukturą danych przechowywaną jako w tabeli zamknięcia.Sortowanie poddrzewa w hierarchicznej strukturze danych tabeli zamknięcia
Chciałem użyć tej struktury do przechowywania menu mojej strony internetowej. Wszystko działa dobrze, ale problem polega na tym, że nie wiem, jak sortować dokładnie podtree w niestandardowej kolejności. W tej chwili drzewo jest sortowane w kolejności, w jakiej pozycje zostały dodane do bazy danych.
Moja struktura opiera się na Bill Karwin's article o tabelach zamknięcia i kilku innych postach.
Oto moja baza danych struktura 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);
Tu jest mój kwerendę wybierającą na jednym drzewie:
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
Na przykład DEMO z __ROOT_ = 1 zapytanie to:
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 niestandardowej kolejności)?
Widziałem kilka rozwiązań dotyczących bułki tartej (jak sortować za pomocą bułki tartej), ale nie wiem, jak je generować i zmieniać.
+1 dziękujemy za opublikowanie przykładowego pliku DDL i danych. –