Verschachtelte Kategorien...

Sebigf

Erfahrenes Mitglied
Hallo zusammen!

Ich habe eine Kategorien - Engine gebaut, mit der es möglich sein soll, mehrere Unterkategorien anzulegen.

Ich habe daher mit SQL eine "bezug_id" Spalte eingebaut, in der jeweils die überstehende Kategorie stehen soll

Struktur: id, Name, Bezug_id

15 Bilder 0
16 Venedig Bilder 15
17 Private Bilder 16

Wie kann ich das am besten so lösen, dass es quasi "unendlich" viele Unterkategorien gibt? Wichtig dabei währe, dass man es vielleicht als Funktion lösen kann...

Wichtig: Der ganze Inhalt soll direkt unter eine geöffneten Kategorie stehen:

Kategorie 1
Kategorie 2
- Bilder 1
- Bilder 2
- Bilder 3
Kategorie 3

Daher ist in der Funktion ja keine while() möglich....

Bitte um Hilfe!

Danke!
 
Guten Morgen,

ich verstehe nicht, was du mit "unendlich" meinst? Denn, wenn du die BezugID (oder auch foreign key (= Fremdschlüssel)) angibst, kannst du beliebig viele Unterkategorien erstellen.
 
:) Es geht einfach nur darum, wie ich das auslesen anstelle...

Wie sollte ich das am besten umsetzen, wenn ich alles in eine Funktion hauen möchte, um die ganzen Abfragen zu sparen...
 
Was du vor allem benötigst, ist eine gescheite Abfrage, welche die Daten zur weiteren Verarbeitung optimal sortiert und vorbereitet.
 
Genau das ist mein Problem. Ich möchte das ganze Teil als "flexibles" Modul überall einsetzen können.

Und ich nach 2 Wochen wieder was umschreiben, weils wiedermal nicht flexibel genug ist.
Ich habe mir gedacht, ich setze das LIMIT einmal auf 5 Unterkategorien (Ebenen), weil es meiner Meinung nach genug ist...

Aber wie stelle ich das nun an, dass es jeweils zugeordnet wird, und vor allem keine verwirrung gibt?
 
So, ich hatte dieses Thema mal ein wenig nach hinten geschoben, nun muss ich aber wieder ran ;)

Ich habe mir folgendes überlegt:

Ich begrenze die Verschachtelungen auf 5 Ebenen und werde beim Hinzufügen jeweils eine Zahl von 1-5 in den DB-Entry setzen. Meint ihr, dass es so sinvoll ist?

Ansonsten würde mir da keine Lösung einfallen, mit der ich besser zurrecht kömmen würde....

Danke
 
Ich schlage folgende Tabellenstruktur vor:
Code:
Bezeichner	Typ
========================================
id		INT AUTO_INCREMENT
parentID	INT
title		VARCHAR
href		VARCHAR
Datensätze, die kein Eltern-Element haben, besitzen als Eltern-ID den Wert Null.

Eine Abfrage und Verarbeitung der Daten könnte wie folgt aussehen:
Code:
SELCT
        `parentID`,
        `title`,
        `href`
  FROM
        `tabelle`
  ORDER BY
        `parentID`
Die weitere Verarbeitung könnte wie in einem ähnlichen Thema beschrieben ablaufen. Dazu müssen die Daten aus der Datenbank allerdings vorher noch „aufbereitet“ werden.
 
;) Danke für die schnelle Antwort.

Das sieht alles schon sehr gut aus, und wird so auch mal von mir umgesetzt...
Nur was meine Hauptsorge ist, wie ich das verschachteln der Ebenen ermöglichen kann.

Ich würde es vom Aufbau gerne so haben:

cat1
__- cat2
____- cat3

Klar kann ich es immer wieder bezogen auf die "ParentID" machen, aber ich würde es evtl. "unendlich" verschachtelbar machen...

Ich kann ja nicht immer wieder eine while() Schleife machen, und das 100x. Ich sehe da eine for() Schleife als Lösung, aber wie kann ich das machen, da die "vorherige" ID immer die ParentID wird?

Also: Wie kann ich die ID vom vorherigen Durchlauf mitnehmen...!? Oder hast du eine bessere Idee?

Danke!
 
Zuletzt bearbeitet:
Hi,
mit der jetzig vorgeschlagenen Datenstruktur ist es ohne weiteres möglich in eine unendliche Hierachie zu gelangen. Ich persönlich würde dennoch folgende Datenbankstruktur bevorzugen, da im jetzigen Fall eine Kategorie nur 'einer' ober Kategorie angehören kann.

Code:
# Table: Categories
# -----------------
ID          AUTO_INCREMENT,PRIMARY_KEY
parent      INT(11)
title       VARCHAR(50)

Code:
# Table: CatAssigments
# --------------------
thisID      INT(11)
toID        INT(11)

In der Tabelle "Categories" werden ganz einfach alle Kategorien gespeichert. Die INT Spalte parent wird durch z.B. "1" markiert das es eine Hauptkategorie ist.
In der Tabelle "CatAssignments" werden alle zugehörigkeiten gesetzt. Die Spalte "thisID" enthält die ID der Kategorie welche einer anderen Kategorie angehört ("toID").
Für eine saubere Datenbankstruktur wäre es schön wenn in der Tabelle "CatAssignments" Fremdschlüssel gesetzt würden. Ist vielleicht alles etwas abstrakt, aber ich denke dennoch leicht verständlich.

Gruß Manuel
 
Danke für die Antwort... :)

Sieht auch sehr verständlich aus das ganze. Nur was "eigentlich" mein Hauptproblem ist, ist die Frage, wie ich den php/sql Code umsetzen soll.

foreach?

Ich weis einfach nicht, wie ich das ganze abfragen lassen soll, dass es wirklich eine "unendliche" hirarchie geben "kann". ;)

Danke!
 
Zurück