baumstruktur, nur anders rum

emmis

Grünschnabel
Hallo,

normalerweise habe zumindest ich bisher nur mit Bäumen gearbeitet, zu der es in der Verästelung immer eindeutige Beziehungen gab, heisst: jeder Eintrag hat einen und nur einen Parent-Eintrag.

Nun habe ich aber hier den Fall, dass ein Eintrag zu mehreren Parent-Einträgen (im Beispiel: kat #5) verbunden ist und das auch noch in auf verschiedenen Ebenen der Baum-Hierachie. Hinweis: ich lege die daten nicht selber so an, sondern versuche Vorgaben zu analysieren.

Für den ersten Fall habe ich feine und performante Statements bauen können, doch zum unten beschriebenen Fall fällt mir nix mehr ein. Lässt sich dies überhaupt in einer stored procedure umsetzen?

Die Stuktur
Code:
CREATE TABLE `baum` (
    `id_eintrag` INT(3) NOT NULL DEFAULT '0',
    `parentId` TINYINT(3) NULL DEFAULT NULL,
    `name` VARCHAR(2) NULL DEFAULT NULL
);

die Daten
Code:
INSERT INTO `baum` (`id_eintrag`, `parentId`, `name`) VALUES (1, NULL, 'kat #1');
INSERT INTO `baum` (`id_eintrag`, `parentId`, `name`) VALUES (2, 1, 'kat #2');
INSERT INTO `baum` (`id_eintrag`, `parentId`, `name`) VALUES (3, 2, 'kat #3');
INSERT INTO `baum` (`id_eintrag`, `parentId`, `name`) VALUES (4, 1, 'kat #4');
INSERT INTO `baum` (`id_eintrag`, `parentId`, `name`) VALUES (5, 4, 'kat #5');
INSERT INTO `baum` (`id_eintrag`, `parentId`, `name`) VALUES (6, 5, 'kat #6');
INSERT INTO `baum` (`id_eintrag`, `parentId`, `name`) VALUES (7, 11, 'kat #5');
INSERT INTO `baum` (`id_eintrag`, `parentId`, `name`) VALUES (8, 2, 'kat #8');
INSERT INTO `baum` (`id_eintrag`, `parentId`, `name`) VALUES (9, 10, 'kat #9');
INSERT INTO `baum` (`id_eintrag`, `parentId`, `name`) VALUES (10, 8, 'kat #10');
INSERT INTO `baum` (`id_eintrag`, `parentId`, `name`) VALUES (11, NULL, 'kat #11');
INSERT INTO `baum` (`id_eintrag`, `parentId`, `name`) VALUES (12, 11, 'kat #12');
INSERT INTO `baum` (`id_eintrag`, `parentId`, `name`) VALUES (13, 11, 'kat #13');
INSERT INTO `baum` (`id_eintrag`, `parentId`, `name`) VALUES (14, 2, 'kat #5');

Ziel ist es all Möglichen Kombinationen aus dem Root heraus aufzulisten.
Vielleicht hat ja jemand den richtigen Anstoss ...
 
Zuletzt bearbeitet:
item: Du solltest in deinem Create-Table-Script die Länge des Feldes Name auf 7 Zeichen erweitern damit die Namen auch Platz haben.

item: MySQL, Oralce, MS SQL, Pervasive SQL... ?

item: Mit MySQL hatte ich mal was - leider geht das mit deinem Ansatz nicht
MySQL Hierarchie Baum (Adjacency Tree) auslesen

item: Wenn es MySQL in Kombination mit PHP ist, habe ich eine fertige Klasse für dich:
PHP AdjacencyTree Class
Habs damit getestet und funktioniert einwandfrei
PHP:
<pre>
<?php 

//Die AdjacencyTree-Klassen laden
include_once 'AdjacencyTree.php';
//Standart DB-Connection herstellen
include_once 'connect.php';

//TreeObject erstellen
$tree = new AdjacencyTree();
//Root als NULL setzeb
$tree->setRootKey(NULL);

//Die Daten aus der DB laden
$sql = <<<SQL
    SELECT
        t.*
    FROM
        baum AS t;
SQL;

$result = mysql_query($sql);
//Die Nodes erstelle ich hier mal mit der createNode-Funktion von AdjacencyTree
while($row = mysql_fetch_assoc($result)){
	$tree->createNode($row['id_eintrag'], $row['parentId'], $row['name']);
}

//Tree berechnen
$tree->calcTree();

//und ausgeben.
foreach($tree as $node){
	echo "{$node->treeText}<br />\n";
}
?>
</pre>
Ergibt das folgende
Code:
kat #11
-- kat #12
-- kat #13
-- kat #5
kat #1
-- kat #2
-- -- kat #5
-- -- kat #3
-- -- kat #8
-- -- -- kat #10
-- -- -- -- kat #9
-- kat #4
-- -- kat #5
-- -- -- kat #6
 
Zurück