[SQL] beliebig viele (Unter-)kategorien auslesen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [SQL] beliebig viele (Unter-)kategorien auslesen

    Einen wunderschönen guten Abend, liebe Community,

    ich tüftle seit Stunden an einem, denke ich, ziemlich einfachen Problem, aber ich komme einfach nicht auf die Lösung.

    Ich habe eine Tabelle mit beliebig vielen Kategorien und Unterkategorien, wobei die Verschachtelung auch beliebig tief sein soll.
    Es gibt das Feld `id`, das Feld `oid` und das Feld `bezeichnung`.
    Feld `oid` ist = `id`, wenn der Datensatz eine Unterkategorie von `id` ist. Das sollte ja eigentlich noch alles standard sein und mir beliebige viele Kategorien ermöglichen können.

    Nun muss ich aber diese gesamte Tabelle, sozusagen rekursiv anzeigen lassen. Es soll eine Baumstruktur entstehen, bei der die Kategorien jeweils nach `bezeichnung` sortiert sind.

    Folgendes habe ich mir schon zusammengeschustert.
    Ich habe hier auch mal alle sonstigen Infos mit reingeschrieben, die mir zur Verfügung stehen.

    PHP-Code:
    /*
    DROP TABLE IF EXISTS `table_kats`;
    CREATE TABLE `table_kats` (
      `id` int(11) NOT NULL auto_increment,
      `oid` int(11) NOT NULL default '0',
      `bezeichnung` varchar(100) NOT NULL default '',
      PRIMARY KEY  (`id`),
      KEY `oid` (`oid`)
    )
    INSERT INTO `table_kats` (`id`, `oid`, `bezeichnung`) VALUES 
    (1, 0, 'Baumaschinen'),
    (2, 1, 'Kräne'),
    (3, 1, 'Bagger'),
    (4, 1, 'Laster'),
    (5, 1, 'Bulldozer'),
    (6, 0, 'Landwirtschaftsmaschinen'),
    (7, 5, 'Test-Unterkategorie')

    Gewünschte Ausgabe:
    ################################
    Baumaschinen
      +--  Bagger
      +--  Bulldozer
        +--  Test-Unterkategorie
      +--  Kräne
      +--  Laster
    Landwirtschaftsmaschinen
    ################################
    */

    $query "SELECT    a.id AS okat_id, 
                        a.oid AS okat_oid, 
                        a.bezeichnung AS okat_bezeichnung, 
                        b.id AS kat_id,
                        b.oid AS kat_oid,
                        b.bezeichnung AS kat_bezeichnung
            FROM        `table_kats` AS b
            INNER JOIN  `table_kats` AS a
            ON          b.oid = a.id
            ORDER BY    a.bezeichnung"
    ;

    $temp '';
    $result mysql_query($query);
    while(
    $this mysql_fetch_array($resultMYSQL_ASSOC))
        {
        if (
    $this['okat_bezeichnung'] != $temp)
            {
            echo 
    $this['okat_bezeichnung'].'<br />';
            
    $temp $this['okat_bezeichnung'];
            }
        echo 
    '&nbsp;&nbsp;+--&nbsp;&nbsp;'.$this['kat_bezeichnung'],'<br />';
        }

    /*
    Tatsächliche Ausgabe:
    ################################
    Baumaschinen
      +--  Kräne
      +--  Bagger
      +--  Laster
      +--  Bulldozer
    Bulldozer
      +--  Test-Unterkategorie
    ################################
    */ 
    Ich danke für jeden Hinweis und oder Tipp!
    mfg
    Alexander Mieland
    APP - Another PHP Program
    http://www.php-programs.de

  • #2
    entweder du machst das ganze rekursiv, was ich aber nicht empfehlen würde, oder eben über nested sets.
    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


    Kommentar


    • #3
      Hi Abraxax,

      Naja, rekursiv hätte ich es schon gerne, weil nur dann beliebig tiefe Verschachtelungen möglich sind, oder irre ich mich jetzt?

      Leider habe ich aber nichtmal ansatzweise eine Idee, wie ich den bisherigen Code so in einer rekursiven Funktion verpacken kann, dass da dann die korrekte Baumstruktur returned wird.
      mfg
      Alexander Mieland
      APP - Another PHP Program
      http://www.php-programs.de

      Kommentar


      • #4
        Okay, sorry, das war Blödsinn.

        Ich habe den Begriff "nested set" eben tatsächlich zum ersten Mal gehört, ob man's glaubt oder nicht.
        Dank flinker Finger und Google bin ich auch schnell auf den Trichter gekommen, was das ist und wie das funktioniert. Leider sieht es aber so aus, als ob ich dafür meine bisherige Tabellen-Struktur komplett umbauen müsste...?

        Wenn jemand eine kurze und schmerzlose Lösung parat hat, ohne die bisherige Tabelle zu verändern, ob mit nested sets oder rekursiv ist ja dann relativ egal, obwohl überall von rekursiven SQL-Satetments abgeraten wird, dann her damit.

        Ansonsten muss ich mich mal in nested sets einarbeiten und meine Tabelle entsprechend umbauen.

        Danke für eventl. Tipps...
        mfg
        Alexander Mieland
        APP - Another PHP Program
        http://www.php-programs.de

        Kommentar


        • #5
          erst einmal ein lob an dich, dass du dich selbstständig auf die suche nach nested sets gemacht hast. scheinbar ist das nicht für alle user eine selbstverständlichkeit. also ein LOB an dich.

          es gibt noch eine möglichkeit, wie du deine bisherige tabelle behalten kannst. du muss nur noch eine 2. dazu bauen. aber das ding ist echt tricky, wenn auch gut. für anfanger aber leider nicht unbedingt geeignet. daher lasses wir das (vorerst) einmal.

          für nested sets gibt es auch bereits fertige klassen (class(es)) und tutorials. ein tut findest du hier einfach mal durchstöbern. hatte jetzt selber keine lust das ding zu suchen. aber dort ist was.

          auch findest du im netz noch ne ganze menge an infos dazu. und eben auch die eben angesprochenen klassen.

          ich weiss jetzt nicht, wieviele daten du bereits in deiner jetzigen tabelle hast. aber ich denke schon, dass sich ein umbau lohnt. probier es mal aus. vom mir aus auch erst einmal mit testdaten, was eh sinnvoller ist. einfach mit dem nested sets modell ein wenig spielen.
          INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


          Kommentar


          • #6
            Hi nochmal,

            ersteinmal danke an Dich, Abraxas, für den Tipp mit den nested sets. Das ist ja 'ne richtig coole Sache.
            Habe mir da mal ein richtig cooles Tut angeschaut, übrigens hier auf php-resource.de zu finden, und bin schon um einiges schlauer. Habe auch schon angefangen, meine Tabelle und die Querys umzubauen und komme da auch ganz gut vorran. So schwer, wie es überall heisst, ist es gar nicht.

            Momentan hänge ich allerdings an einer Sache:
            Ich habe nach
            diesem Tutorial, wie gesagt angefangen, meine Sache umzubauen und bin schon soweit, dass er mir die root-node rausholt und entsprechend anzeigt. Nun habe ich aber bei nested sets keine "Kennung", also keine ID, mit der ich einzelne Knoten wieder als Root-Knoten nehmen kann, um so alle Zweige aus diesem Unterknoten anzeigen zu lassen.

            Oder anders ausgedrückt:
            Ich baue mir kein Forum, also nichts, was irgendwie einer Baumstruktur ähnelt, sondern ich baue ein Katalog-System, welches mir zuerst die Hauptkategorien anzeigen soll, wenn man dort auf eine draufklickt, soll er mir nur die darin enthaltenen Unterkategorien, ohne deren Inhalt, anzeigen, wenn ich dann wieder auf eine Unterkategorie klicke, soll er mir wieder deren Unterkategorien anzeigen, ohne deren Inhalt, etc...pp.

            Nun brauche ich also einen Link, den ich auf die Kategorien legen kann, damit ich dann anhand der übergebenen Variablen, den Inhalt AB dieser Kategorie auslesen kann und nicht wieder den ganzen Baum, mitsamt aller Oberkategorien darüber.

            Ich weiss, ist sicher etwas umständlich ausgedrückt, wüsste aber nicht, wie ich es verständlicher machen kann.
            Naja, vielleicht weiss da ja nochmal jemand (Abraxas? *g*) einen Tipp für mich?


            Zum googlen, Suche benutzen und sich selbst informieren:
            Nun ich bin selber Foren-Admin (und Programmierer) und weiss selber, wie schwer es ist, seinen Usern beizubringen, sich auch mal selbst zu informieren und nicht immer sofort wegen jeder Kleinigkeit "Hilfe" zu schrei(b)en und einen neuen Thread anzufangen. *g*
            mfg
            Alexander Mieland
            APP - Another PHP Program
            http://www.php-programs.de

            Kommentar


            • #7
              Original geschrieben von dma147
              [...] Abraxa[color=red]s[/color] [...]
              *hust*

              da ich das nested set modell selber ehrlich gesagt nicht verwende, kann ich dir keine detail infos geben.

              aber wenn ich nicht irre, kannst du jeden knoten als 'root' ansehen. sprich du kannst dir nur die kategorien darunter anzeigen lassen.

              was die punkte innerhalb einer kategorie angeht, so schreibst du diese sowieso in eine neue tabelle rein. anhand der 'id' in der nested sets tabelle kannst du ja eine sehr schöne zuordnung machen.

              sprich. in den nested sets speicherst du NUR die kategorien ab. den inhalt selbiger machst du in einer neuen tabelle.

              btw. *VERSCHIEB* nach sql
              INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


              Kommentar


              • #8
                Sooo... das was ich machen wollte, habe ich nun, dank nested sets, hinbekommen. Vielen Dank an Abraxas für die Infos und Hilfestellung.

                Infos darüber gibt es zu Hauff im Netz, wer sich dafür interessiert, einfach mal Google bemühen. *g*
                mfg
                Alexander Mieland
                APP - Another PHP Program
                http://www.php-programs.de

                Kommentar


                • #9
                  Original geschrieben von dma147
                  [...] Abraxa[color=red]s[/color] [...]
                  schon wieder .....
                  INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                  Kommentar


                  • #10
                    Lol....

                    sorry Abraxa[COLOR=red]x[/COLOR], ich kenne jemanden der heisst Abraxas, deshalb ist der Nick irgendwie schon in meiner Tatstatur so gespeichert. *g*
                    Soll nicht wieder vorkommen.
                    mfg
                    Alexander Mieland
                    APP - Another PHP Program
                    http://www.php-programs.de

                    Kommentar


                    • #11
                      wir haben hier auch einen mit 's' im forum. und ich lege eben wert auf das x. ;-)
                      INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                      Kommentar

                      Lädt...
                      X