Hierarchische Daten speichern - nested sets aus Listen erzeugen (mysql)
Sehr gute Einführungen in das Thema:
http://dev.mysql.com/tech-resources/articles/hierarchical-data.html
http://articles.sitepoint.com/article/hierarchical-data-database
Skript
zum Einfügen der lft und rgt-Werte in die Tabelle, um ein nested set aus einer adjacency list zu erzeugen.
(Documente/php_test/dw_tests/convert_nested_sets.php)
<?php set_time_limit(0); //es dauert, solangs dauert // DB Verbindung herstellen require_once('Connections/DW_TEST.php'); mysql_select_db($database_DW_TEST, $DW_TEST); // erstmal die Hauptkategorien holen (parent=0) $q_mains = "SELECT id FROM `jib_adsmanager_categories` WHERE `parent`= 0"; // hole Hauptkategorien $mains = mysql_query($q_mains, $DW_TEST) or die(mysql_error()); // in Array speichern while ($result = mysql_fetch_array($mains)) { $main_ids[]=$result[0]; } // ein paar Ausgaben echo count($main_ids) . " Main-IDs geholt.<br/>".PHP_EOL; echo "nested set-Werte in DB schreiben...<br/>" .PHP_EOL; $next = 1; /* * Main Loop * für alle main-ids rebuild_tree aufrufen und * dabei den return-wert als left verwenden... */ foreach ($main_ids as $parent){ $next = rebuild_tree($parent, $next); } echo "Fertig.".PHP_EOL; // // Hauptfunktion // function rebuild_tree($parent, $left) { // the right value of this node is the left value + 1 $right = $left+1; // get all children of this node $q2 = mysql_query('SELECT id FROM `jib_adsmanager_categories` '. 'WHERE parent="'.$parent.'";'); while ($row = mysql_fetch_array($q2)) { // recursive execution of this function for each // child of this node // $right is the current right value, which is // incremented by the rebuild_tree function $right = rebuild_tree($row['id'], $right); } // we've got the left value, and now that we've processed // the children of this node we also know the right value mysql_query('UPDATE `jib_adsmanager_categories` SET lft='.$left.', rgt='. $right.' WHERE id="'.$parent.'";'); // return the right value of this node + 1 return $right+1; } ?>
Abfragen
von Hierarchie-Bäumen sind damit ohne rekursive Funktionen möglich,
z.Bsp erzeugt folgendes Statement einen Subtree aller Werte von "Sammeln & Seltenes"
SELECT node.name, node.parent, node.id FROM jib_adsmanager_categories AS node, jib_adsmanager_categories AS parent WHERE node.lft BETWEEN parent.lft AND parent.rgt AND parent.id = 1 ORDER BY node.parent, node.name
Folgendes Statement holt den Pfad von einem Endpunkt ("Leaf"):
SELECT parent.name, parent.id, parent.parent FROM jib_adsmanager_categories AS node, jib_adsmanager_categories AS parent WHERE node.lft BETWEEN parent.lft AND parent.rgt AND node.id =65857 ORDER BY parent.lft
Ergebnis:
Sammeln & Seltenes 1 0
Memorabilia 195 1
Sport 33454 195
Formel 1 33458 33454
Shirts & Polos 65855 33458
Größe S 65857 65855

Kommentare
convert_nested_sets_live.php hochgeladen
Sonntag, 27. Juni 2010 15:16:07
Administrator User
convert_nested_sets.php für jibbie Kategorien-Update
Sonntag, 27. Juni 2010 14:34:49
Administrator User
Bitte melden Sie sich an oder registrieren Sie sich um kommentieren zu können.