Ich habe diese Tabelle:Wie generiert man eine Baumansicht aus dieser Ergebnismenge basierend auf dem Tree Traversal-Algorithmus?
CREATE TABLE `categories` (
`id` int(11) NOT NULL auto_increment,
`category_id` int(11) default NULL,
`root_id` int(11) default NULL,
`name` varchar(100) collate utf8_unicode_ci NOT NULL,
`lft` int(11) NOT NULL,
`rht` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `category_id` (`category_id`),
KEY `lft` (`lft`,`rht`),
KEY `root_id` (`root_id`)
)
auf diese Frage basiert: Getting a modified preorder tree traversal model (nested set) into a <ul>
Der Unterschied ist, dass ich viele Bäume in einer Tabelle haben. Jede Zeile hat einen Fremdschlüssel, der das übergeordnete Element und das oberste übergeordnete Element darstellt: category_id und root_id. Ich habe auch die LFT und rht Felder auf der Grundlage dieses Beispiel: http://articles.sitepoint.com/article/hierarchical-data-database/2
Auf der Grundlage dieser Zeilen:
INSERT INTO `categories` VALUES(1, NULL, NULL, 'Fruits', 1, 14);
INSERT INTO `categories` VALUES(2, 1, 1, 'Apple', 2, 3);
INSERT INTO `categories` VALUES(3, 1, 1, 'Orange', 4, 9);
INSERT INTO `categories` VALUES(4, 3, 1, 'Orange Type 1', 5, 6);
INSERT INTO `categories` VALUES(5, 3, 1, 'Orange Type 2', 7, 8);
INSERT INTO `categories` VALUES(6, 1, 1, 'Pear', 10, 11);
INSERT INTO `categories` VALUES(7, 1, 1, 'Banana', 12, 13);
INSERT INTO `categories` VALUES(8, NULL, NULL, 'Eletronics', 1, 14);
INSERT INTO `categories` VALUES(9, 8, 8, 'Cell Phones', 2, 3);
INSERT INTO `categories` VALUES(10, 8, 8, 'Computers', 4, 9);
INSERT INTO `categories` VALUES(11, 10, 8, 'PC', 5, 6);
INSERT INTO `categories` VALUES(12, 10, 8, 'MAC', 7, 8);
INSERT INTO `categories` VALUES(13, 8, 8, 'Printers', 10, 11);
INSERT INTO `categories` VALUES(14, 8, 8, 'Cameras', 12, 13);
Wie kann ich eine ordened Liste zu erstellen, diesen Stammbaum darstellt?
mit dem SQL-Gebrüll:
SELECT c. * , (COUNT(p.id) -1) AS depth
FROM `categorias` AS p
CROSS JOIN categories AS c
WHERE (
c.lft
BETWEEN p.lft
AND p.rht
)
GROUP BY c.id
ORDER BY c.lft;
Ich habe dieses Ergebnis:
Wie Sie sehen können, ich brauche auch von root_id zu bestellen, so dass ich die richtigen erzeugen kann Baum.
Gibt es nach dem Baum auch eine Möglichkeit, jeden Knoten nach seinem Namen zu sortieren?
Danke, werde ich diese Zeilen lesen und versuchen. Obwohl ich mich fragte, ob es nicht einen Weg gibt, wiederholt lft und rht zu halten, da ich einen Weg habe, zu unterscheiden (root_id). Ich habe bereits eine Abfrage mit etwas wie: WHERE root_id = 1 OR id = 1 ORDER BY lft erreicht, um einen der Bäume (aber nicht alle) zu erhalten. Das ist wirklich der falsche Weg? Auch habe ich die root_id als Referenz, wenn Sie die rebuild_tree() -Methode verwenden, die unter diesem Link aufgeführt ist http://articles.sitepoint.com/article/hierarchical-data-database/3 So funktioniert alles einwandfrei außer der SELECT für ordentierte Listen. –
Wenn ich Ihre Schritte befolge, wie kann ich die Funktion rebuild_tree() ändern, um nur einen Baum und nicht alle neu zu erstellen? Da ich root_id entfernen werde? –
Wenn Sie die Bäume immer trennen (wie bei WHERE root_id = 1), ist es OK, Überlappungen zwischen verschiedenen Sätzen zuzulassen. Ihre ursprüngliche Abfrage hat jedoch zwei Bäume gemischt. Um nur eine Baumstruktur wiederherzustellen, rufen Sie einfach 'rebuild_tree (1)' oder 'rebuild_tree (8)' auf. Dies wird nur die Bäume neu aufbauen, die von '1' oder' 8' beginnen. – Quassnoi