Home / ez@work / Hierarchische Daten speichern - nested sets aus Listen erzeugen (mysql)

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 &amp; Seltenes 1 0
Memorabilia 195 1
Sport 33454 195
Formel 1 33458 33454
Shirts &amp; Polos 65855 33458
Gr&ouml;&szlig;e S 65857 65855

Verwandter Inhalt

Kommentare

convert_nested_sets_live.php hochgeladen

unter:
http://php.lbm-service.de/convert_nested_sets_live.php
PW-geschütztes Verzeichnis! (selbe Login wie jib-administrator)

convert_nested_sets.php für jibbie Kategorien-Update

Falls die ebay-Kategorien upgedatet werden müssen, muß neben php5/getCategories.php und import_categories.php auch
convert_nested_sets.php neu ausgeführt werden.
getCategories holt den CatTree.xml von ebay
import... füllt die DB (es findet kein truncate statt! also vorher leeren!)
convert_nested_sets.php füllt die Spalten lft und rgt, die für nested-set-Abfragen benötigt werden.

Bitte melden Sie sich an oder registrieren Sie sich um kommentieren zu können.

 

© 2011 by lbm-services.de - All rights reserved.

Valid XHTML 1.0 Transitional