datenbank rekursiv abfragen

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

  • datenbank rekursiv abfragen

    hallo!

    ich habe folgendes problem:

    ich habe (primitiv dargestellt) eine mysql-table die so aussieht:

    CaseID|MainCaseID

    ich möchte jetzt eine php-function schreiben die mir sagt wieviele subcases ein maincase hat

    damit man sich auch ein bisschen auskennt ein beispiel:

    CaseID|MainCaseID
    1 | 0
    2 | 1
    3 | 1
    4 | 3
    5 | 3
    6 | 5
    7 | 5
    8 | 7

    wenn die maincaseid 0 ist ist es ein hauptcase und wenn ein case eine maincaseid hat ist es ein subcase des jeweiligen cases..

    also der hauptcase im obrigen bsp ist der case mit der id 1 welcher zwei subcases hat welche die id 2 und 3 haben..! diese zwei subcases haben wieder jeweils zwei subcases (4,5,6,7)..! zu guter letzt hat der subcase mit der id 7 noch einen subcase (id: 8)

    wie kann ich jetzt rekursiv herausfinden wieviele subcases der maincase mit der id 1 nun wiklich hat..?!



    bitte bitte helft mir weil ich habe schon unzähliges sachen ausprobiert und es hat nie geklappt..



    lg, harry d.

  • #2
    Am beste liest du erst mal alle Daten in ein Array der folgendermassen aussieht:
    PHP-Code:
    <?php
    while ( ... ) $cache[$row['MainCaseID']] = $row;
    ?>
    Danach baust du dir eine Funktion die das ganze rekursiv auswertet.
    PHP-Code:
    <?php
    function myfunction($MainCaseID)
    {
     global 
    $cache;

     ...
    }

    myfunction(0);
    ?>
    So einfach geht das.
    [COLOR=#9C5245]Internet-Explorer[/COLOR] [COLOR=#334D7B]User und stolz drauf! :P[/COLOR]

    Kommentar


    • #3
      Na vielleicht wäre etwas Sourcecode von dir auch hilfreich.
      Oft sind es nur Kleinigkeiten die geändert werden müssen.

      Kommentar


      • #4
        Original geschrieben von eRoZion
        Am beste liest du erst mal alle Daten in ein Array der folgendermassen aussieht:
        PHP-Code:
        <?php
        while ( ... ) $cache[$row['MainCaseID']] = $row;
        ?>
        Danach baust du dir eine Funktion die das ganze rekursiv auswertet.
        PHP-Code:
        <?php
        function myfunction($MainCaseID)
        {
         global 
        $cache;

         ...
        }

        myfunction(0);
        ?>
        So einfach geht das.
        hehehe.. also wie es theoretisch ausschauen muss ist mir klar gewesen aber gerade deine "einfache" funktion welche das alles rekursiv auswertet habe ich gestern nicht mehr geschafft..!- werde mich heute noch einmal mit dem problem beschäftigen da gestern ein sch**ß tag war und sowieso alles schief gegangen ist was schief gehen kann..


        mfg.- harry

        Kommentar


        • #5
          hallo!!

          einer meiner lösungsansätze war/ist folgender:

          PHP-Code:

          function watch_opensubcases($cid)
          {
              
          connect();

              for (
          $i=0;$i<count($cid);$i++)
              {
                  
          $sql=mysql_query("SELECT status FROM case_data 
          WHERE caseid = '"
          .$cid[$i]."' LIMIT 1");
                  
                  if (
          $sql)
                  {                
                      
          $tmp=mysql_fetch_array($sql);
                      
                      if ((
          $tmp['status'] == 1) || ($tmp['status'] == 2))
                      {
                          return 
          true;
                      }
                  }
                  else
                  {
                      
          show_error(21);
                  }
              }

          PHP-Code:

          function exist_opensubcases($cid)
          {
              
          $scid[0] = get_subcaseids($cid); //übergibt ein array mit allen subcases des cases $cid
              
              
          if (watch_opensc($scid))
              {
                  return 
          true;
              }
              else
              {
                  for (
          $i=0;$i<count($scid[0]);$i++)
                  {
                      
          $scid[$i+1] = get_subcaseids($scid[0][$i]);
                      
                      if (
          watch_opensc($scid[$i+1]))
                      {
                          return 
          true;
                      }
                      else
                      {
                          ...
                      }
                  }
              }


          .. leider bin ich zur zeit schon extrem reif für die insel und deshalb schaffe ich es nicht mir das problem vorzustellen und in einen code zu packen..


          falls irgend jemand einen vorschlag hat und mir helfen will bitte ich ihn auf allen vieren..


          thx und lg, harry d.

          Kommentar


          • #6
            Versuche es mal so, wie ich es beschrieben haben. Und merke Dir unbedingt, dass man keine Querys in eine schleife packt. Denn wie Du Dir vorstellen kannst, ergibt das eine enorme Belastung für den Server. Die Lösung mit einem Array ist in meinen Augen die performantere.
            [COLOR=#9C5245]Internet-Explorer[/COLOR] [COLOR=#334D7B]User und stolz drauf! :P[/COLOR]

            Kommentar

            Lädt...
            X