Vorgänger/Nachfolger Problem

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

  • Vorgänger/Nachfolger Problem

    Hey,

    ich habe eine Table welche u.A. zwei Spalten besitzt Vorgänger = pnr, Nachfolger vnr

    Aus dieser Tabelle möchte ich nun alle Leute selektieren die direkt oder indirekt die Untergebenen vom Mueller sind

    Mit meinem bisherigen Ansatz bekomme ich leider nur die direkten Untergebenen und eine Idee wie ich die indirekten bekomme hab ich im Moment auch nicht...

    select p1.name from pers p1, pers p2, pers p3 WHERE p1.vnr= p2.pnr AND p1.vnr=p3.pnr AND p3.name ='Mueller'


    Vielen Vielen Dank für eure Hilfe

  • #2
    Wenn du alle haben willst, mußt du rekursiv durchlaufen. So wie du es atm hast, geht nur 2 Ebene tief.

    Kommentar


    • #3
      Zitat von asp2php Beitrag anzeigen
      Wenn du alle haben willst, mußt du rekursiv durchlaufen. So wie du es atm hast, geht nur 2 Ebene tief.
      Hi, könntest du mir freundlicherweise hier etwas weiterhelfen?

      Hab eben das ganze erweitert aber jetzt bekomme ich nur noch die letzte ebene

      Kommentar


      • #4
        ist einfach, suche im Forum nach rekursiv oder Rekursion. Im Prinzip läuft es so ab: (Pseudo-Code)
        PHP-Code:
        function GetChild($person)
        {
               
        Schleife über alle Kinder
               
        {
                     if (
        $child->hasChild)
                           
        GetChild($child)
                     else
                           
        Kinder ausgeben
                
        }

        Kommentar


        • #5
          sorry, mir gehts nur um den dbms skill zu verbessern....

          d.h. keine php unterstützung.....

          hmm oracle hat hierfür was in petto würde aber gerne das ganze mal für 3 ebenen haben und das bekomm ich aktuell gerade nicht hin....

          müsste aber irgendwie mit union vermutlich zu schaffen sein

          Kommentar


          • #6
            Hm ... ich glaube ich hab' was übersehen. Deine Datenstruktur ist doch NestedSet, oder? Such mal im Forum nach NestedSet, da kannst du die Nachfahren alle auf einmal auslesen.

            Kommentar


            • #7
              Zitat von asp2php Beitrag anzeigen
              Hm ... ich glaube ich hab' was übersehen. Deine Datenstruktur ist doch NestedSet, oder? Such mal im Forum nach NestedSet, da kannst du die Nachfahren alle auf einmal auslesen.
              Ne das ist kein nested sets.....
              das sieht so aus

              Beispiel:
              1 | 2
              2 | 3
              3 | 4
              4 | 3
              5 | 4
              6 | 4


              In Oracle wäre es
              Code:
              select name 
              from pers 
              WHERE pnr IN
                  (select pnr
                  from pers
                  connect by vnr = prior pnr
                  start with vnr = 
                    (select pnr
                    from pers
                    where name='Mueller'));
              allerdings ist das kein SQL Standard will das ohne das hier hinbekommen

              Kommentar


              • #8
                3|4
                4|3

                Zirkelbezug? Was ist denn das für 'ne Datenstruktur? Ohne den Zirkelbezug ist es stink normale Vater->Sohn Prinzip und mit Rekursion schnell zu erledigen, aber nicht mit MySQL; hier musst du PHP zur Hilfe nehmen.

                Kommentar


                • #9
                  Zitat von asp2php Beitrag anzeigen
                  3|4
                  4|3

                  Zirkelbezug? Was ist denn das für 'ne Datenstruktur? Ohne den Zirkelbezug ist es stink normale Vater->Sohn Prinzip und mit Rekursion schnell zu erledigen, aber nicht mit MySQL; hier musst du PHP zur Hilfe nehmen.
                  Sry das Beispiel hab ich mir aus den Finger gesaugt....Es ist nur ein Vater->Sohn Prinzip und soweit ich weiss kann man das mit einer fixen Ebene in jedem DBMS bauen......Es ist nicht dynamisch das ist klar

                  Oracle kann mit solchen Datenstrukturen mit ner beliebigen Ebene wie oben auch umgehen......

                  Mir geht es aber um fest definierte Ebenen und dafür braucht man kein PHP

                  Kommentar


                  • #10
                    Wasfür DBMS hast du?

                    Kommentar


                    • #11
                      Zitat von asp2php Beitrag anzeigen
                      Wasfür DBMS hast du?
                      im moment oracle

                      so hab jetzt ne lösung erarbeitet aber ob das einfacher geht nunja

                      Code:
                      select p1.name from pers p1, pers p2, pers p3 WHERE p1.vnr= p2.pnr AND p1.vnr=p3.pnr AND p3.name ='Mueller'
                      union
                      select p1.name from pers p1, pers p2, pers p3, pers p4 WHERE p1.vnr= p2.pnr AND p2.vnr=p3.pnr AND p3.pnr=p4.pnr AND p4.name='Mueller'

                      Kommentar


                      • #12
                        Ich verstehe nicht, warum du Oracle hast und keine Oracle-spezifische P/L SQL verwenden? Ist dein System nicht genug ausgelastet? Ansonstens könntest du mit 4-fachen LEFT JOIN auch zum Ziel kommen; z.Z. machst du mit CROSS JOIN, dass ist zu großzügig, aber wenn du dein DB-Server an die Leistungsgrenze treiben willst ist natürlich OK.

                        Kommentar


                        • #13
                          Zitat von asp2php Beitrag anzeigen
                          Ich verstehe nicht, warum du Oracle hast und keine Oracle-spezifische P/L SQL verwenden? Ist dein System nicht genug ausgelastet? Ansonstens könntest du mit 4-fachen LEFT JOIN auch zum Ziel kommen; z.Z. machst du mit CROSS JOIN, dass ist zu großzügig, aber wenn du dein DB-Server an die Leistungsgrenze treiben willst ist natürlich OK.
                          in Oracle läuft das sogar recht flott durch.....

                          wird vermutlich ganz doll optimiert, könnte ka nachschlagen aber me ist gerade kaputt

                          Kommentar

                          Lädt...
                          X