Nested Sets: Vater / Parent auslesen

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

  • Nested Sets: Vater / Parent auslesen

    Hallo,

    ich benutze Nested Sets in einem WWS für die Warengruppen. Nun habe ich das Problem, dass ich für die einzelnen Gruppen wissen muss, welcher übergeordneten Gruppe sie angehören. Da diese aber in der DB nicht mitgespeichert wird, weiß ich nicht, wie ich sie innerhalb des SQL-Statements auslesen kann. Ich habe es zwar geschafft, die Zuordnung während der Verarbeitung der Daten mit PHP auszuwerten, jedoch würde mich interessieren, wie man das mit SQL während der Abfrage lösen kann.

    DB-Struktur (vereinfacht):

    ID (INT, AI)
    rechts (INT)
    links (INT)
    bez (VARCHAR)

    Das SQL-Statement ist das übliche

    Code:
    SELECT g2.*,
        COUNT(*) AS level
      FROM wws_warengruppen AS g1,
           wws_warengruppen AS g2
      WHERE g2.links BETWEEN g1.links AND g1.rechts
        GROUP BY g2.links
    Das Notlösung mit PHP sieht so aus:

    PHP-Code:
    while($M=mysql_fetch_object($rs)) {
      
    $allids[]=$M->id;
      if (
    $M->level>1) {
         
    $im["{subid}"]=$M->id;
         
    $im["{subtitel}"]=$M->bez;
         if (
    $M->level>$oldlevel && $M->level>2) {
            
    $im["{parentid}"]=$oldsubid[$M->level-1];
            
    $ausgabe["{subs}"].=loadtpl('./templates/subs.tpl',$im);
            
    $oldsubid[$M->level]=$M->id;
         } else {
            ++
    $cnt;
            if (
    $cnt==|| $M->level==2) { $im["{parentid}"]=$allids[0]; }
            
    $ausgabe["{subs}"].=loadtpl('./templates/subs.tpl',$im);
            
    $oldlevel=$M->level;
            
    $oldsubid[$M->level]=$M->id;
         }
         
    $oldgid=$M->gid;
      }

    Alternativ habe ich noch eine andere Lösung für andere Zwecke.

    PHP-Code:

           
    if ($M->level>1) {
              
    $im["{subid}"]=$M->id;
              
    $im["{subtitel}"]=($M->level==1) ? '<b>'.$M->bez.'</b>' $M->bez;
              if (
    $M->level>$oldlevel && $M->level>2) {
                 
    $im["{oldsubid}"]=$oldsubid[$M->level-1];
                 
    $ausgabe.=loadtpl('./module/wws/templates/add_menue_subsub.tpl',$im);
                 
    $oldsubid[$M->level]=$M->id;
              } else {
                 
    $ausgabe.=loadtpl('./module/wws/templates/add_menue_sub.tpl',$im);
                 
    $oldlevel=$M->level;
                 
    $oldsubid[$M->level]=$M->id;
              }
              
    $oldgid=$M->gid;
           } 
    Beide funktionieren soweit gut, aber es ist nicht das, was ich für die Zukunft benötige. Gibt es also eine Möglichkeit, die "Vater" bzw. "Parent" ID eines DS innerhalb der SQL-Abfrage herauszufinden?

    Interessant wäre ebenfalls, ob man die genaue Stuktur auslesen kann. Angenommen, das Nested Set besteht aktuell aus 7 Ebenen. Wäre es dann möglich, die genaue Zugehörigkeit zu allen Überebenen auszulesen?

    Z. B.:

    Code:
    1: 1
    2: -1.1
    3: -1.2
    4: --1.2.1
    5: --1.2.2
    6: ---1.2.2.1
    7: ----1.2.2.1.1
    8: -1.3
    ....
    Wenn ich nun wissen will, wem der DS mit der ID 7 gehört, gleich während der Abfrage die einzelnen Zugehörigkeiten auslese. So wären dies bei der ID 7 z. B.

    ebene1: 1
    ebene2: 3
    ebene3: 5
    ebene4: 6

    Aber das ist nur so nebenbei. Mein Hauptproblem bezieht sich lediglich auf die Übergeordnete Gruppe.

    Vielen Dank im Vorraus, sofern mir jemand helfen kann.
    Zuletzt geändert von plastikbaum; 04.08.2005, 11:52.

  • #2
    papavon7 = select y.id from tabelle x, tabelle y where x.id=7 and y.links<x.links and y.rechts>x.rechts order by y.rechts limit 1

    alternativ auch einfach den links- oder rechts-Wert:

    linksvon7 = select max(y.links) from tabelle x, tabelle y where x.id=7 and y.links<x.links and y.rechts>x.rechts

    rechtsvon7 = select min(y.rechts) from tabelle x, tabelle y where x.id=7 and y.links<x.links and y.rechts>x.rechts
    mein Sport: mein Frühstück: meine Arbeit:

    Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

    Kommentar


    • #3
      Hmm, aber damit erhalte ich ja immer nur den Vater eines expliziten Datensatzes. Wenn ich den Vater von 7 will, bekomme ich ihn. Das ist natürlich klar. Um nun die Väter ALLER Datensätze zu erhalten, müsste ich bei dieser Lösung für jeden Datensatz eine Query absetzen.

      Mir geht es darum, einen ganzen Baum auszulesen und zu jedem Datensatz des Baumes den Vater.

      Vielleicht habe ich das auch missverstanden, jedoch sehe ich die 3 Querys nicht als geeignet - oder anders: ich weiß nicht, wie ich die normale Baumabfrage um diese erweitern könnte.

      Was ich habe:

      Code:
      SELECT g2.*,  COUNT(*) AS level
        FROM wws_warengruppen AS g1,
             wws_warengruppen AS g2
        WHERE g2.links BETWEEN g1.links AND g1.rechts
          GROUP BY g2.links
      
      Ergibt:
      
      Großvater
        Sohn1
        Sohn2
          Enkel1
          Enkel2
          Enkel3
        Sohn3
        Sohn4
          Enkel4
          Enkel5
          Enkel6
        Sohn5
      Was ich jedoch benötige:

      Code:
      Großvater
        Sohn1 (Vater: Großvater)
        Sohn2 (Vater: Großvater)
          Enkel1 (Vater: Sohn2)
          Enkel2 (Vater: Sohn2)
          Enkel3 (Vater: Sohn2)
        Sohn3 (Vater: Großvater)
        Sohn4 (Vater: Großvater)
          Enkel4 (Vater: Sohn4)
          Enkel5 (Vater: Sohn4)
          Enkel6 (Vater: Sohn4)
        Sohn5 (Vater: Großvater)
      Und so ganz super ideal wäre:

      Code:
      Großvater (Root)
        Sohn1 (E1: Großvater, E2: NULL)
        Sohn2 (E1: Großvater, E2: NULL)
          Enkel1 (E1: Großvater, E2: Sohn2)
          Enkel2 (E1: Großvater, E2: Sohn2)
          Enkel3 (E1: Großvater, E2: Sohn2)
        Sohn3 (E1: Großvater, E2: NULL)
        Sohn4 (E1: Großvater, E2: NULL)
          Enkel4 (E1: Großvater, E2: Sohn4)
          Enkel5 (E1: Großvater, E2: Sohn4)
          Enkel6 (E1: Großvater, E2: Sohn4)
        Sohn5 (E1: Großvater, E2: NUL:)
      Hier wird sich das ganz große Problem aber wohl spätestens dadurch ergeben, dass man nicht weiß, wie viele Ebenen es sind, da diese variieren können.


      Ich weiß nicht, ob das überhaupt mit einer Query realisierbar ist. Aber da ich immer wieder feststelle, dass irgendwie fast alles möglich ist, ... jedoch stelle ich auch fest, dass manches sehr komplex ist und meine Überlegungsfähigkeit teilweise übersteigt.

      Kommentar


      • #4
        wie wär´s wenn du dir den Kram in die Schleife baust?

        $papa[$zeile['level']] = $zeile['titel'];

        und

        echo $papa[$zeile[level]-1];
        bzw
        for ($e=1; $e<=$zeile['level']; $e++) echo 'E'. $e. ': '. $papa[$e]. ', ';


        wär zwar mit einer Query auch direkt möglich, allerdings mit einem bzw. zwei zusätzlichen joins.
        mein Sport: mein Frühstück: meine Arbeit:

        Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

        Kommentar

        Lädt...
        X