Ich möchte Sie bitten, mir bei der Sortierung der hierarchischen Datenstruktur zu helfen, die als Verschlusstabelle gespeichert ist.Sortierung eines Teilbaums in einer Verschlusstabelle hierarchische Datenstruktur
Ich wollte diese Struktur verwenden, um meine Website Menü zu speichern. Alles funktioniert gut, aber das Problem ist, dass ich nicht kenne, wie man den genauen Teilbaum in einer kundenspezifischen Reihenfolge sortiert. Im Moment wird der Baum in der Reihenfolge sortiert, in der die Elemente zur Datenbank hinzugefügt wurden.
Meine Struktur basiert auf Bill Karwin's article über Closure Tabellen und einige andere Beiträge.
Hier ist meine MySQL-Datenbankstruktur mit einigen Demo-Daten:
--
-- 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);
Hier meine SELECT-Abfrage für einen Baum ist:
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
Für die DEMO-Instanz mit __ROOT_ = 1, die Abfrage bekommt:
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
Aber was ist, wenn ich zum Beispiel die Reihenfolge von Cat 1.1 und Cat 1.2 ändern muss (entsprechend dem Namen oder einer kundenspezifischen Bestellung)?
Ich habe einige Breadcrumbs-Lösung (wie nach Breadcrumbs sortieren) gesehen, aber ich weiß nicht, wie man sie erzeugt und ändert.
+1 danke für die Buchung der Beispiel-DDL und Daten. –