Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP] Datensätze als Baum darstellen (https://www.delphipraxis.net/108794-%5Bphp%5D-datensaetze-als-baum-darstellen.html)

alcaeus 2. Mär 2008 21:28

Re: [PHP] Datensätze als Baum darstellen
 
Moin,

warum rekursiv wenn es auch iterativ geht? Die Loesung heisst Nested set. Ein paar Artikel dazu:
http://www.codeproject.com/KB/database/nestedsets.aspx (Die Queries sind zwar fuer MSSQL geschrieben, aber die Theorie sollte rueberkommen)
http://www.developersdex.com/gurus/articles/112.asp
http://www.developer.com/db/article.php/3517366

Der Vorteil der Sets ist, dass du die Elemente mit einem Query rausziehen kannst:
SQL-Code:
SELECT * FROM foo ORDER BY left_id ASC
Anschliessend musst du nur noch einmal ueber das Ergebnis drueberiterieren und entsprechend einruecken. So kriegst du auch bei riesigen (mein groesster Test war ~ 2 Mio. Blaetter) Baeumen kein Problem mitm Stack :)

Greetz
alcaeus

omata 2. Mär 2008 22:13

Re: [PHP] Datensätze als Baum darstellen
 
Hättest du dich mit meinem erwähnten Link beschäftigt, dann wäre das für dich kein Problem gewesen...

SQL-Code:
CREATE PROCEDURE `proc_GetParents`(NodeID INTEGER)
BEGIN
  DECLARE _Depth INT DEFAULT 1;
  DECLARE _Done INT DEFAULT 0;

  CREATE TEMPORARY TABLE tmpTable (
    id INT PRIMARY KEY, parentid INT, Depth INT, NodePath VARCHAR(1000)
  ) TYPE=HEAP;
  CREATE TEMPORARY TABLE tmpTable2 (
    id INT PRIMARY KEY, parentid INT, Depth INT, NodePath VARCHAR(1000)
  ) TYPE=HEAP;

  INSERT tmpTable (id, parentid, Depth, NodePath)
  SELECT id, parentid, _Depth, reihenfolge
  FROM nodes
  WHERE id = NodeID;
  IF ROW_COUNT() = 0 THEN
    SET _Done = 1;
  END IF;
  WHILE _Done = 0 DO
    SET _Depth = _Depth + 1;
    INSERT tmpTable2 (id, parentid, Depth, NodePath)
    SELECT t.id, t.parentid, _Depth, CONCAT(x.NodePath, '|', Reihenfolge)
    FROM nodes t
    INNER JOIN tmpTable x
      ON t.id = x.parentid
    WHERE x.Depth = _Depth-1;
    IF ROW_COUNT() = 0 THEN
      SET _Done = 1;
    END IF;
    INSERT tmpTable
    SELECT *
    FROM tmpTable2;
    DELETE FROM tmpTable2;
  END WHILE;

  SELECT t.id, t.parentid, t.bez, x.Depth, x.NodePath
  FROM nodes t
  INNER JOIN tmpTable x
    ON t.id = x.id
  ORDER BY x.NodePath DESC;

  DROP TEMPORARY TABLE tmpTable;
  DROP TEMPORARY TABLE tmpTable2;
END
Aber ich vermute, du möchtest das so nicht lösen. Schade, so geht das richtig leicht und schnell. Das ist das was alcaeus auch vorschlägt, ich habe es dir sogar schon für MySQL realisiert.
naja egal.

Gruss
Thorsten

Matze 2. Mär 2008 23:27

Re: [PHP] Datensätze als Baum darstellen
 
Hallo ihr beiden,

ich habe mich nun ein wenig mit den nested sets befasst und es ist schon erstaunlich, wie einfach das Auslesen funktioniert. Anhand dieses Artikels bastel ich mir erstmal eine ganz kleine Klasse dafür und versuche, ob ich damit klar komme.

Wie ich es dir, Thorsten, damals schon geschrieben habe, gefallen mir diese temporären Tabellen überhaupt nicht. Wenn ich Daten auslesen möchte, dann hätte ich gerne nur Lesezugriffe und will nicht zuerst mehrere temporäre Tabellen anlegen und nach dem Auslesen wieder löschen. Ich könnte mir vorstellen, dass das Risiko eines Datenverlustes auch ein wenig größer ist, wobei das vermutlich unwahrscheinlich ist.

Dennoch vielen Dank für deine Mühe und ich hoffe, du denkst nun nicht, dass ich undankbar sei. Mich freut es wirklich, dass du mir diese Möglichkeiten aufzeigst. Ich wusste vorher auch nicht, dass so etwas geht, dennoch gefällt mir diese Lösung, wie gesagt, nicht sonderlich.
Ich könnte mir aber gut vorstellen, dass andere über diesen SQL-Code dankbar sind, die eine andere Einstellung gegenüber dieser Vorgehensweise haben.

Einen guten Wochenanfang wünscht
Matze


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:32 Uhr.
Seite 4 von 4   « Erste     234   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz