Ausgabe von Kategorien und Subkategorien

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Ausgabe von Kategorien und Subkategorien

    Hallo, ich brauche mal eure Hilfe.

    Ich wollte meine Kategorien und die dazugehörigen Subkategorien ausgeben.

    In meiner SQL Tabelle "Kategorien" sind folgende Spalten: ID, Hauptkategorie, Position, Name

    Ich will jetzt also alle Kategorien nach der Reiehe ausgeben und nach der Kategorie sofort die Subkategorie.
    Dazu lass ich erst mal alle Kategorien die keine hauptkateorie haben ausgeben ( das sind die Hauptkategorien) und dann wollte ich alle ausgeben die eine Hauptkategorie haben und somit die Subkategorien sind.

    PHP-Quellcode

    1. <?php while($aus = mysql_fetch_array($sql)){
    2. if ($aus['hauptkat'] == "0") { ?>
    3. <li><a href="?go=kat&kat=<?php echo $aus['id'] ?>"> -> <?php echo $aus['name'] ?> </a></li>
    4. <?php if ($aus['hauptkat'] > "0") { ?>
    5. <li><a href="?go=kat&kat=<?php echo $aus['id'] ?>"> -> <?php echo $aus['name'] ?> </a></li>
    6. <?php } } } // Ende der Schleife ?>



    Das Problem ist das er mir nur die Hauptkategorien ausgeben will. Könnt ihr mir helfen ?

    habe ich das vom Prinzip her sinnvol gelöst oder ist das totaler quatsch ?
  • hier ein kleines Beispiel

    Erste while Schleife ---- $sql = mysql_query("Select * from kategorien where Hauptkategorie = ''");
    |
    v
    Zweite while Schleife ---- $sql = mysql_query("Select * from kategorien where Hauptkategorie != '' and Hauptkategorie = '".$row->id."'");

    Ich weiss ja nicht wie die Datenbank aufgebaut ist, aber das sollte sich auf alles ableiten können.
  • Ja thx,

    also mit zwei ineinander verschachtelten while schleifen funktioniert es.

    PHP-Quellcode

    1. <?php while($aus = mysql_fetch_array($sql)){ ?>
    2. <li><a href="?go=kat&kat=<?php echo $aus['id'] ?>"> -> <?php echo $aus['name'] ?> </a></li>
    3. <?php
    4. $auswahl2 = "SELECT * FROM *** WHERE haupt*** = ".$****['id']." ORDER BY position ASC";
    5. $sql2 = mysql_query($auswahl2);
    6. while($aus2 = mysql_fetch_array($sql2)) { ?>
    7. <li><a href="?go=kat&kat=<?php echo $aus2['id'] ?>"> ----> <?php echo $aus2['name'] ?> </a></li>
    8. <?php } } // Ende der Schleife ?>
  • Du könntest dein Ziel durch eine Art Workaround erreichen:

    Quellcode

    1. SELECT parent.ID AS p_ID
    2. , parent.Hauptkategorie AS p_Hauptkategorie
    3. , parent.Position AS p_Position
    4. , parent.Name AS p_Name
    5. , child.ID AS c_ID
    6. , child.Hauptkategorie AS c_Hauptkategorie
    7. , child.Position AS c_Position
    8. , child.Name AS c_Name
    9. FROM Kategorien AS parent
    10. LEFT JOIN Kategorien AS child
    11. ON child.Hauptkategorie=parent.ID
    12. WHERE ISNULL(parent.Hauptkategorie)
    13. ORDER BY parent.Position, child.Position;
    Alles anzeigen


    Die Datensätze, die du erhältst haben dann folgende Form: p_ID, p_Hauptkategorie, p_Position, p_Name, c_ID, c_Hauptkategorie, c_Position, c_Name. Dieser Ansatz hat aber einige Nachteile:

    • die Breite des RS ist hoch, die Daten der Hauptkategorie werden ggf. mehrfach übergeben
    • dieses Prinzip funktioniert nur, wenn du maximal zwei Ebenen hast, es also keine Unterunterkategorien gibt.
    • das Interpretieren der Daten im RS ist etwas umständlicher


    Aber es ist zumindest der Abfrage der Unterkategorien pro Hauptkategorie in einer Schleife vorzuziehen. Die beste Lösung für derartige Probleme sind aber sicher Nested Sets. Dazu ist aber das Tabellenlayout und ggf. auch der Code zur Verwaltung dieser Daten anzupassen.
  • splasch schrieb:

    Die Lösung ist ganz einfach du brauchst weder eine noch eine 2 while scheife. Sowie auch ein Sql befehl der dich hier nicht viel weiter bringt.
    Das was du benötigst dafür ist eine Rekusive Funktion. Aber vorsicht dabei das du keine Endlos Schleife damit erzeugst.

    Mfg Splasch



    Er nicht mittels einer Schleife die Abfrage durchführen aber durch Rekursion?
    Nein, bestimmt nicht.

    Halte dich lieber an die anderen Posts ;)
  • @splasch: Datenbankabfragen sind teuer! Deshalb ist eine Lösung, die mit O(n) = 1 (z.B. mein Vorschlag oder eben Nested Sets) auskommt einer mit O(n) = n (geschachtelte Schleifen oder Rekursion) deutlich vorzuziehen.

    Anmerkung für Informatiker: O(n) soll sich hier nur auf das Laufzeitverhalten bezüglich der Datenbankabfragen beziehen, nicht auf den restlichen Code. Nur am Rande, bevor ich mich hier in die Nesseln setze. ;)
  • Marcus Gnaß schrieb:

    @splasch: Datenbankabfragen sind teuer! Deshalb ist eine Lösung, die mit O(n) = 1 (z.B. mein Vorschlag oder eben Nested Sets) auskommt einer mit O(n) = n (geschachtelte Schleifen oder Rekursion) deutlich vorzuziehen.

    Anmerkung für Informatiker: O(n) soll sich hier nur auf das Laufzeitverhalten bezüglich der Datenbankabfragen beziehen, nicht auf den restlichen Code. Nur am Rande, bevor ich mich hier in die Nesseln setze. ;)

    Da komme ich gerade nicht ganz mit. Wenn er alle Kategorien ausgeben will. Wieso reicht dann nicht ein einfaches "SELECT * FROM 'blubber'"? Er kann die Daten ja in PHP weiter verarbeiten und sortieren. (Sprich durch eine Schleife laufen lassen, die ihm das ganze dann in die richtige Reihenfolge bringt...
    My lovely mister singing club...
  • Wie gesagt, das richtige Stichwort lautet Nested Sets.

    Da man Bäume nicht mit SQL mit einem Select darstellen kann, bedarf es eben "komplexeren" Schreiboperationen um die gesamte Hierarchie mit einem SELECT lesen zu können.
    Auf der Wikipedia Seite zu [wikipedia]Nested_Sets[/wikipedia] findest du auch ein MySQL 5 Stored Procedure Beispiel. Damit ist die Handhabung nicht mehr so kompliziert.
    Das Datenbank Modell ist ganz simpel: "Links, Rechts, Bezeichnung". Links und Rechts zeigen jeweils auf die Elternknoten.

    Ich persönlich implementiere übrigens keine Nested Sets für eine Navigation, die sich maximal 1x die Woche (oder eher 1x im Jahr) ändert.
    Die Komplexität reduziere ich mir lieber indem ich das Datenbankmodell in ein Array auslese, cache und dann lesen.