nochmal Bäume in SQL

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

nochmal Bäume in SQL

Beitrag von freedimension »

Ich habe eine Baumstruktur in SQL in welcher jeder Eintrag auf den jeweils übergeordneten verweist. Desweiteren hat jeder Eintrag einen Namen.

Code: Alles auswählen

tree
--------------------------
id  |  parent   |   name
Jetzt bräuchte ich möglichst schnelle Methoden um

a) den aus den Namen zusammengesetzten Pfad eines Eintrages zu ermitteln
b) einen bekannten Pfad einem Eintrag zuzuordnen

Im Moment trage ich den Pfad in ein zusätzliches Feld path ein, funktioniert auch, jedoch stören mich dabei ein paar Dinge:
- unnötige Redundanz der Daten
- umständliche Wartung der Pfade (wenn sich Namen ändern ändern sich auch die Pfade untergeordneter Einträge)

Wenn mich jemand auf den Pfad der Erleuchtung bringen könnte wäre ich ihm sehr dankbar :)
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
FloHimself
Beiträge: 338
Registriert: 05.09.2004 18:47

Beitrag von FloHimself »

Vielleicht lieg ich ja voll daneben jetz..
Du meinst Bäume in dieser Form?

Code: Alles auswählen

name (id, parent)

Peter  (1,0)
     \
      Klaus  (2,1)
          \
          Gabi  (3,2)
        /      \ 
Markus  (4,3)   Sandra  (5,3)
    |               \
Gustav  (6,4)       ...
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

Schöne Zeichnung :allright:
Und ja, genau sowas meine ich.

Was ich jetzt bräuchte:

- ermitteln von Pfad XYZ (also bei id 5: 'Peter/Klaus/Gabi/Sandra')
- zuordnen eines gegebenen Pfades (also wenn ich 'Peter/Klaus/Gabi/Markus/Gustav' habe ermitteln dass dieser Pfad zur id 6 gehört.) Dabei beachten dass derselbe Name an jeweils anderer Stelle mehrmals vorkommen darf.
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
FloHimself
Beiträge: 338
Registriert: 05.09.2004 18:47

Beitrag von FloHimself »

Da ich jetz nicht den gesamten Zusammenhang kenne, schau doch mal hier http://ffm.junetz.de/members/reeg/DSP/n ... 0000000000
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

Danke, das ist eine sehr interessante Herangehensweise.
Ich denke das kann man verwenden, es löst ja immerhin eines meiner Probleme und das andere Problem wird etwas vereinfacht.

Was ich da nicht so toll finde, ist das ein einziger Datenfehler in den Beziehungen gleich den gesamten Baum zunichte macht. Dem kann man aber IMHO ganz gut entgegentreten indem man zusätzlich halt doch weiterhin mit ParentID arbeitet und den Baum dann bei erfolgten Änderungen doppelcheckt und evtl. anhand der ParentID die l und r-Werte neu aufbaut. So würde dann wenigstens nur die Sortierung innerhalb einer Ebene verlorengehen.
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Benutzeravatar
Clipper
Beiträge: 30
Registriert: 24.12.2004 06:47
Wohnort: NRW

Beitrag von Clipper »

Vielleicht ist dies ein Ansatz:

Du hast eine Tabelle namens List

Code: Alles auswählen

id	parent	name
1	10	Heinz
2	1	Gustav
3	5	Hilde
4	0	Jürgen
5	2	Peter
6	3	Simone
7	4	Karin
8	9	Jens
9	0	Anne
10	0	Sabine

Ein SELECT: 

SELECT list.name, list_1.name, list_2.name
FROM (list INNER JOIN list AS list_1 ON list.id = list_1.parent) INNER JOIN list AS list_2 ON list_1.id = list_2.parent;

bringt diese Liste:
[quote]
list.name	list_1.name	list_2.name
Sabine	Heinz		Gustav
Gustav	Peter		Hilde
Heinz		Gustav	Peter
Peter		Hilde		Simone
Je nachdem wie tief die Ebenen laufen sollen musst Du entsprechend JOINEN

Wenn Du den Pfad eines Eintrag finden willst setzt Du entsprechend WHERE list.id=x


Wenn Du den Eintrag zu einem Pfad wissen willst
SELECT list.name
FROM list INNER JOIN list AS list_1 ON list.id = list_1.parent INNER JOIN list AS list_2 ON list_1.id = list_2.parent
WHERE list_1.id=1 AND list_2.id=2

Ergebnis "Sabine"
Antworten