# mysql - tree auslesen und richtig ordnen



## vodn7v (15. Feb 2007)

hallo,
ich lese eine tabelle mit daten aus meiner db aus und generiere damit einen tree.
ich durchlaufe die tabelle einmal. und so wie die daten in der tabelle stehen werden sie aufgelistet.
ich habe vater_id's benutzt. die werden richtig zugeordnet zu den hauptgruppen.
ich würde jedoch gerne die hauptgruppen verschieben können.

kann man in der db eine bestimmte reihenfolge festlegen ? wenn ich einen eintrag aus der tabelle gelöscht habe. dann wird mein nächster eintrag an genau dieser stelle eingetragen.

wie kann man sowas am besten lösen ? 

oder die tabelle auslesen,punkt an gewünschter stelle einfügen. tabelle komplett löschen und dann wieder einfügen.

oder gibt es noch einfachere methoden ??

danke


----------



## AlArenal (15. Feb 2007)

Klar kannst du in der DB eine Reihenfolge festlegen, z.B. indem du eine Spalte hinzufügst, die die ID des nächsten Eintrags enthält, oder die des vorangegangenen, oder beides.. oder einen Eintrag zur Wichtung (Zahlen von 1 bis x), oder oder oder

Am saubersten ist die Abbildung von Bäumen in einer relationalen Datenbank über Nested Sets. Das erfordert aber einiges an Hirnschmalz. Inserts sind dann etwas komplexer, man kann aber eine Vielzahl von Abfragen, die mit der guten alten Elter-Referenzierung elend lange dauern, mit einem einzigen Select abbilden...


----------



## vodn7v (15. Feb 2007)

hm.. so richtig habe ich das noch nichts verstanden..

also ich nehmen an mein baum sieht ursprünglich so aus:

erstes is die id, 2tes die parent id:

1 - 0
2 - 0
3 - 1
4 - 1
5 - 2
6 - 2
7 - 0
8 - 0
9 - 3
10 - 5

jetzt lösche ich id nr 5,8,10


1 - 0
2 - 0
3 - 1
4 - 1
6 - 2
7 - 0
9 - 3

und möchte einen neuen knotenpunkt einfügen der zwichen 1 und 2 liegt:

1 - 0
10 - 0
2 - 0
3 - 1
4 - 1
6 - 2
7 - 0
9 - 3

wie krieg ich den an die stelle da ?
meine schleife liest die tabellenspalte einfach von oben nach unten aus.
oder wie kann man sowas besser lösen ?

thx

EDIT:

es geht ja eig nur um die elemente die als parent die id 0 haben. alle anderen werden ja automatisch richtig zugeordnet.

habe ich jetzt als hauptordner

Inhaltsverzeichnis
Weltkarte
Auto


und will aber das Auto als erstes angezeigt wird möchte ich nicht jeden untepunkt umändern im verzeichnis.


----------



## Yzebär (15. Feb 2007)

Wie wäre es mit einem "ORDER BY" (Syntax kann evtl. variieren) im select-Statement? Das heißt du sortierst dein Resultset aus der Tabelle nach den gewünschten Werten und der gewünschten Reihenfolge (ASC, DESC).

Als Beispiel könnte das dann so aussehen:

```
select * from MyTable order by ASC parentid, id
```

Damit würde das Resultset aufsteigend (von 0 beginnend) nach ParentId und dann (wenn die ParentId gleich ist) nach Id sortieren.


----------



## AlArenal (15. Feb 2007)

Er will ja nciht nach ID sortieren, sondern sich selbst was stricken. Warum die Idee mit der zusätzlichen Spalte mit Werten für die Sortierung da suspekt war - keine Ahnung. Ich finds naheliegend 

P.S.:
Wenn es um eine reine wechselnde Sortierung geht, ist die DB da eh der flasche Ansprechpartner. Wenn es um eine Festlegung der Reihenfolge durch den Benutzer und Widerherstelleung bei nächsten Einlesen der Daten geht, dann gibts keinen Weg als zusätzlich Informationen in der DB abzulegen, sollten die vorhanden Felder das nicht hergeben können.


----------

