Fk auf sich selber

Nob

Mitglied
Hallo zusammen

Ich habe eine Mysql - Tabelle Kategorie.

id | name | fk_kategorie
-----------------------------------
1 | a | 0
2 | b | 1
3 | c | 0
4 | d | 1
5 | e | 2

Jetzt möchte ich den Inhalt mit php wie folgt anzeigen:
  • a
  • b
  • e
  • d
  • c

Leider fällt mir da keine effiziente Lösung ein, hat jemand von euch eine Idee?

Vielen Dank
 
Leider hab ich überhaupt nicht verstanden, was du erreichen willst. Erklär dein Problem bitte etwas genauer!

Aus der Überschrift ergibt sich aber, dass du anscheinend nach einem Self Join suchst...
 
Also ich habe das auch nich genau verstanden, und kann leider auch kein MySQL ;-) aber wenn du das einfach als so eine Liste ausgeben willst mach das doch so:
PHP:
// Die Werte aus der DB liegen im Array $daten vor
while($daten[$nr] < count($daten)
{
echo '<li>'.$daten[$nr],'</li>';
$nr++;
}
dann würde das als eine Liste ausgegeben werden
 
Hallo

Danke für die Antworten.

Sorry, dass ich es zu ungenau beschrieben habe.
Ich möchte eine Baumstruktur erstellen.
Diese Struktur sollte untereinander und entsprechend eingrückt ausgegeben werden.

Klar könnte ich alle Kategorien auslesen, die beim Feld fk_kategorie den Wert 0 haben.
Danach für jeden ausgelesenen Datensatz wieder eine Abfrage generieren etc.. bis ich alle Einträge habe.

Zweite Variante wäre, alles auslesen und mit php zu sortieren.

Aber es müsste doch einen eleganteren und effizienteren Weg geben?

Besten Dank
 
Eine elegantere Variante wären sogenannte Nested Sets. Diese Seite hatt mir dabei sehr geholfen überhaupt dahinterzusteigen wie so etwas funktioniert. :)
 
Danke für die Antwort.

Genau so etwas suche ich.
Ich habe allerdings gelesen, dass es beim Nested Set Modell zwar zum auslesen kein schnelleres Verfahren gibt, es dafür aber beim einfügen sehr lange dauert.
Genau umgekehrt ist es bei der "Vater-id" Variante.

Da ich jetzt aber sehr viele Daten in dieser Tabelle habe, diese oft angezeigt und bearbeitet werden, welche Variante würdet ihr mir vorschlagen?

Vielen Dank
 
Das die Eingabe länger dauern soll habe ich noch nicht gehört oder gemerkt. Wenn du viele Daten hast, eindeutig Nested Set.
 
Wenn ich doch einen Eintrag lösche oder hinzufügen möchte (nicht der letzte sondern einer in der "mitte") dann muss ich doch alle nachfolgenden Einträge bearbeiten oder nicht?

Besten Dank
 
Schau mal im Tutorialsbereich für PHP. Da hat Sven Mintel irgendwo ein Tut gepostet, um ein Menü wie hier im Board zu erstellen. Dort ist auch irgendwo eine Funktion dabei, die dir das so sortiert, wie du es brauchst.

Wenn ich das Tut finde, poste ich den Link. Kann etwas dauern, da ich den titel des Tuts nicht mehr genau kenne.

EDIT: sehe grad, das du das ja ganz anders nummerierst. Du gibst ja an, auf welcher Ebene sich dieser Eintzrag befinden soll... Aber wird das nicht eher problematisch? Woher weißt du, an welcher Position was stehen soll? Über die ID? Und wenn du etwas löscht und einen neuen Eintrag erstellst, der dann genau an die Stelle des Gelöschten soll, wie sotierst du das dann?
Vielleicht ist es besser mit IDs, und Parent_IDs zu arbeiten? (je nachdem, was denn entstehen soll) Dann kannst du nämlich die oben beschriebene Funktion von Sven nutzen :)
 
Zuletzt bearbeitet:
Vielen Danke für die vielen Antworten.

Ich habe mich jetzt in das Thema "Nested Sets" ein bisschen eingearbeitet...
Leider stehe ich jetzt in der Zwickmühle...
Für meine Kategorie verwende ich jetzt Nested Sets, aber welche Variante (Nested Sets / Vater-Kind) würdet ihr mir für einen Artikel-bestand empfehlen?
Es sind ca. 10000 Artikel und werden natürlich immer mehr. Die wenigsten haben "Unterartikel", also ein Kind. Die Daten werden so oft geändert wie angezeigt..


Das Problem bei der Nested Sets - Variante ist ja bekannt..
beim Einfügen eines Kontens müssen fast alle (die meisten) Knoten geändert werden.
Dies dauert bei meinem Artikelbestand natürlich sehr lange.. :(

Bei der Vater-Kind Variante wüsste ich eben nicht auf anhieb wer ein Kind hat, somit müsste ich für jeden ausgelesenen Artikel eine Abfrage generieren (rekursiv).
Ich könnte natürlich manuell beim eintragen eines Kindes beim Vaterartikel ein Flag setzten, damit ich weiss, für welche Artikel ich eine Abfrage generieren muss, damit ich nicht tausende Abfragen generiere, die eh kein Ergebnis liefern.


Welche Variante haltet ihr für besser? Oder gibt es noch eine andere Möglichkeit?

Gruss
 
Zurück