Differenz berechnen

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

  • #16
    Die bloße Existenz von Datensätze ist da mit Sicherheit kein Grund. Nicht bei einem so simplen update...
    Wahrlich nicht nein, aber wenn ich dazu mehrere andere Scripte anpassen müsste schon.


    Hm.., vielleicht sind wir beide heute etwas schwierig? ;D

    PHP-Code:
            $akt date("m");
            
    $fnull 0;
            
    $raum $akt 5
            echo 
    "$raum";
            if (
    $akt <= 9) {
                
    $raum2 $fnull."".$raum;
            } else {
                
    $raum2 $raum;
            }
            
    $sql "SELECT 
    user, monat, jahr, minuten 
    FROM minuts 
    WHERE jahr = '2008' AND monat BETWEEN 
    $raum2 AND $akt 
    ORDER BY user, monat"
    ;
            
    $result mysql_query($sql) or die(mysql_error());
             
    $vmon 0;
             echo 
    "<table style='width:80%' border='1'><tr>
                    <th class='P' style='vertical-align:top'>UserId</th>
                    <th class='Q' style='vertical-align:top'>Jahr</th>
                    <th class='P' style='vertical-align:top'>Monat</th>
                    <th class='Q' style='vertical-align:top'>Online</th>
                    <th class='P' style='vertical-align:top'>Monat</th>
                    <th class='Q' style='vertical-align:top'>Online</th>
                    <th class='P' style='vertical-align:top'>Monat</th>
                    <th class='Q' style='vertical-align:top'>Online</th>
                    <th class='P' style='vertical-align:top'>Monat</th>
                    <th class='Q' style='vertical-align:top'>Online</th>
                    <th class='P' style='vertical-align:top'>Monat</th>
                    <th class='Q' style='vertical-align:top'>Online</th>
                    </tr>\n"
    ;
             while (
    $row mysql_fetch_assoc($result)) {
            echo 
    "<tr><td>" $row['user'] . "</td>";
            echo 
    "<td>" $row['jahr'] . "</td>";
    // die nächste Zeile müsste 5 mal durchlaufen werden und nicht nur einmal
    // dh. von hier bis... 
                 
    $diff = ($vmon == 0) ? '&nbsp' $row['minuten'] - $vmon;
            echo 
    "<td>";
            if (
    $row['monat'] == "01") { echo "Januar"; }
            if (
    $row['monat'] == "02") { echo "Februar"; }
            if (
    $row['monat'] == "03") { echo "März"; }
            if (
    $row['monat'] == "04") { echo "April"; }
            if (
    $row['monat'] == "05") { echo "Mai"; }
            if (
    $row['monat'] == "06") { echo "Juni"; }
            if (
    $row['monat'] == "07") { echo "Juli"; }
            if (
    $row['monat'] == "08") { echo "August"; }
            if (
    $row['monat'] == "09") { echo "September"; }
            if (
    $row['monat'] == "10") { echo "Oktober"; }
            if (
    $row['monat'] == "11") { echo "November"; }
            if (
    $row['monat'] == "12") { echo "Dezember"; }
            echo 
    "</td>";
            echo 
    "<td>$diff</td>";
    //.. hier hin während einmal while-durchlauf, 5 mal das haben... 
                 
    echo "</tr>";
             
    $vmon $row['minuten'];
        }
        echo 
    "</table>"
    Es soll ja ein ergebniss wie zuletzt beschrieben dabei raus kommen. Also 1 User = eine Zeile für die letzten 5 Monate mit Differenz

    Kommentar


    • #17
      Nun.., mittlerweile habe ich mich dazu durchgerungen, die jeweilige Differenz mit zu speichern - war kein grosser Akt und vereinfachte vieles, zumal die ganze rechnerei nun wegfällt.

      Nun habe ich allerdings das Problem, dass dennoch für jeden Datensatz eine Zeile ausgegeben wird anstat eine Zeile mit allen Inhalten dahinter.

      Wahrscheinlich sitze ich einfach schon zu lange dran und sehe den Wald vor lauter Bäumen nicht mehr..


      PHP-Code:
      <?php

              $akt 
      date("m");
              
      $fnull 0;
              
      $raum $akt 5
               
      $monate = array(
          
      "1" => "Januar"
          
      "2" => "Februar"
          
      "3" => "März"
          
      "4" => "April"
          
      "5" => "Mai"
          
      "6" => "Juni",  
          
      "7" => "Juli",
          
      "8" => "August"
          
      "9" => "September"
          
      "10" => "Oktober",  
          
      "11" => "November"
          
      "12" => "Dezember");

               echo 
      "<table style='width:80%' border='1'><tr>
                      <th class='P' style='vertical-align:top'>UserId</th>
                      <th class='Q' style='vertical-align:top'>Jahr</th>"
      ;
              for (
      $i $raum$i <= $akt$i++) {
                      echo 
      "<th class='P' style='vertical-align:top'>".$monate[$i]."</th>
                      <th class='Q' style='vertical-align:top'>Online</th>"
      ;
              }
                  echo 
      "</tr>\n";
              if (
      $akt <= 9) {
                  
      $raum2 $fnull."".$raum;
              } else {
                  
      $raum2 $raum;
              }
              
      $sql "SELECT user, monat, jahr, minuten, diff 
              FROM minuts 
              WHERE jahr = '2008' AND monat BETWEEN 
      $raum2 AND $akt 
              ORDER BY user, monat"
      ;
              
      $result mysql_query($sql) or die(mysql_error());
               while (
      $row mysql_fetch_assoc($result)) {
              echo 
      "<tr><td>" $row['user'] . "</td>";
              echo 
      "<td>" $row['jahr'] . "</td>";
              echo 
      "<td>" $row['minuten'] . "</td>";
              echo 
      "<td>" $row['diff'] . "</td>";
                      echo 
      "</tr>";
              }
          echo 
      "</table>";
      Mir ist klar, dass ich den User innerhalb von while habe und der daher auch jedesmal neu ausgegeben wird, aber wie kann ich es so machen, dass der nur einmal ausgegeben wird? Ggf. ein GROUP BY?


      Gruss

      Kommentar


      • #18
        Hach.., ich spamme doch nicht etwa? :-O


        Lösungsidee ist nun da.., nur fehlt mir das wissen diese umzusetzen.
        Man könnte das doch mit einem sogenannten Gruppenwechsel machen? *denk*.. Nur.., die Lektüren im www dazu sind nicht wirklich eine Hilfe was dieses Thema angeht. Was mir fehlt ist, wie in diesem Fall der Aufbau des ganzen wäre um mein Problem zu lösen. Ein einfaches Konstrukt wie sich das aufbaut würde mir dabei schon sehr weiter helfen. Bin fest davon überzeugt, dass ich es dann selbst soweit bringen würde das es auch so funktioniert wie ich es mir vorstelle. *g*

        Kommentar


        • #19
          Mir ist klar, dass ich den User innerhalb von while habe und der daher auch jedesmal neu ausgegeben wird, aber wie kann ich es so machen, dass der nur einmal ausgegeben wird? Ggf. ein GROUP BY?
          Gruppenwechsel!

          Man könnte das doch mit einem sogenannten Gruppenwechsel machen?
          hehe, genau!

          Also bis jetzt hat es noch jeder, dem ich den Namen gesagt habe, zumindest ansatzweise alleine hinbekommen. Aber weil ich heute mal gut drauf bin.

          $username ='';
          while(...)
          if($username != $row->username)
          echo $row->username;

          ist hoffentlich der gewünschte Ansatz.
          Zuletzt geändert von TobiaZ; 29.06.2008, 14:38.

          Kommentar


          • #20
            Hab nun Deinen Ansatz und das was ich mir aus dem Forum zusammen gesucht habe etwas gebastelt, aber die Anzeige ist nicht wie gewünscht - es erscheint nur jeweils ein Datensatz (also einmal 'minuten' und einmal 'diff') anstatt 5 mal.




            Fehlermeldung hab' ich keine also muss irgendwo in der Verarbeitung der Hund begraben liegen - nur wo?
            PHP-Code:
                    $akt date("m");
                    
            $fnull 0;
                    
            $raum $akt 5

                     
            $monate = array("1" => "Januar"
                            
            "2" => "Februar"
                            
            "3" => "März"
                            
            "4" => "April"
                            
            "5" => "Mai"
                            
            "6" => "Juni",  
                            
            "7" => "Juli",
                            
            "8" => "August"
                            
            "9" => "September"
                            
            "10" => "Oktober",  
                            
            "11" => "November"
                            
            "12" => "Dezember");

                     echo 
            "<table style='width:80%' border='1'><tr>
                            <th class='P' style='vertical-align:top'>UserId</th>
                            <th class='Q' style='vertical-align:top'>Jahr</th>"
            ;
                    for (
            $i $raum$i <= $akt$i++) {
                        
            // echo $i;
                        // echo $monate[$i]."<br>";
                            
            echo "<th class='P' style='vertical-align:top'>".$monate[$i]."</th>
                            <th class='Q' style='vertical-align:top'>Online</th>"
            ;
                    }
                        echo 
            "</tr>\n";
                    if (
            $akt <= 9) {
                        
            $raum2 $fnull."".$raum;
                    } else {
                        
            $raum2 $raum;
                    }
            $alt '';
                    
            $sql "SELECT user, monat, jahr, minuten, diff 
                        FROM minuts 
                        WHERE jahr = '2008' AND monat BETWEEN 
            $raum2 AND $akt 
                        ORDER BY user"
            ;   
                
            $result mysql_query($sql) OR die(mysql_error());    
                if(
            mysql_num_rows($result)) {
                    while(
            $row mysql_fetch_assoc($result)) {
                        
            $neu $row['user'];
                        if (
            $alt != $neu) {        // Gruppenwechsel ?
                            
            if($alt != '') {     //Nicht beim ersten Durchgang
                                
            echo "<TR><TD class=\"P\">".$row['user']."</TD>";
                        echo 
            "<TD class=\"Q\">".$row['jahr']."</TD>";
                        echo 
            "<TD class=\"P\">".$row['minuten']."</TD>";
                        echo 
            "<TD class=\"Q\">".$row['diff']."</TD></TR>";
                    }
                            
            $per = array();        // Array leeren
                            
            $alt $neu;        // Gruppe wechseln
                        
            }
                        
            $per[] = $row['minuten'];    // Daten zwischenspeichern
                    

                    echo 
            "<TR><TD class=\"P\">".$row['user']."</TD>";
                echo 
            "<TD class=\"Q\">".$row['jahr']."</TD>";
                echo 
            "<TD class=\"P\">".$row['minuten']."</TD>";
                echo 
            "<TD class=\"Q\">".$row['diff']."</TD></TR>";
                }
                else {
                    echo 
            "<b>Keine Einträge vorhanden</b>\n";
                }
              echo 
            "</table>"

            Kommentar


            • #21
              Der Teil
              PHP-Code:
                 echo "<TD class=\"Q\">".$row['jahr']."</TD>";
                           echo 
              "<TD class=\"P\">".$row['minuten']."</TD>";
                           echo 
              "<TD class=\"Q\">".$row['diff']."</TD> 
              darf natürlich NICHT in den if() Teil!

              Kommentar


              • #22
                Du meinst

                PHP-Code:
                $alt '';
                        
                $sql "SELECT user, monat, jahr, minuten, diff 
                            FROM minuts 
                            WHERE jahr = '2008' AND monat BETWEEN 
                $raum2 AND $akt 
                            ORDER BY user"
                ;   
                    
                $result mysql_query($sql) OR die(mysql_error());    
                    if(
                mysql_num_rows($result)) {
                        while(
                $row mysql_fetch_assoc($result)) {
                            
                $neu $row['user'];
                            if (
                $alt != $neu) {        // Gruppenwechsel ?
                                
                if($alt != '') {     //Nicht beim ersten Durchgang
                                    
                echo "<TR><TD class=\"P\">".$row['user']."</TD>";
                        }
                            echo 
                "<TD class=\"Q\">".$row['jahr']."</TD>";
                            echo 
                "<TD class=\"P\">".$row['minuten']."</TD>";
                            echo 
                "<TD class=\"Q\">".$row['diff']."</TD></TR>";
                        
                                
                $per = array();        // Array leeren
                                
                $alt $neu;        // Gruppe wechseln
                            
                }
                            
                $per[] = $row['minuten'];    // Daten zwischenspeichern
                        

                        echo 
                "<TR><TD class=\"P\">".$row['user']."</TD>";
                    echo 
                "<TD class=\"Q\">".$row['jahr']."</TD>";
                    echo 
                "<TD class=\"P\">".$row['minuten']."</TD>";
                    echo 
                "<TD class=\"Q\">".$row['diff']."</TD></TR>";
                    }
                    else {
                        echo 
                "<b>Keine Einträge vorhanden</b>\n";
                    }
                  echo 
                "</table>"
                so? Erziehl auch nicht das gewünschte Ergebniss. Oder habe ich das nur falsch verstanden? *g*

                Kommentar


                • #23
                  Moin


                  Nach vielem hin und her probieren, versch. Artikel lesen habe ich nun doch eine funktionierende (mit einem Haken - dazu später mehr) Lösung gefunden. Ich behaupte nun einfach mal, dass es daran lag, dass in meinem Code nur ein Array angesprochen wurde - es müssten aber zwei sein (minuten und diff)

                  Folgendermassen habe ich es nun es bringt auch (fast) das gewünschte Ergebniss:

                  PHP-Code:
                  $alt '';
                          
                  $sql "SELECT user, monat, jahr, minuten, diff 
                              FROM minuts 
                              WHERE jahr = '2008' AND monat BETWEEN 
                  $raum2 AND $akt 
                              ORDER BY user,monat"
                  ;   
                      
                  $result mysql_query($sql) OR die(mysql_error());    
                      if(
                  mysql_num_rows($result)) {
                          while(
                  $row mysql_fetch_assoc($result)) {
                              
                  $neu $row['user'];
                              if (
                  $alt != $neu) {        // Gruppenwechsel ?
                                  
                  if($alt != '') {     //Nicht beim ersten Durchgang
                                      
                  echo "<TR><TD class=\"P\">".$row['user']."</TD>";
                                  echo 
                  "<TD class=\"Q\">".$row['jahr']."</TD>";
                              for(
                  $i=0$i<6$i++) {
                                      echo 
                  "<TD class=\"P\">".$min[$i]."</TD>";
                                  if (
                  $dif[$i] <= "1500") {
                                          echo 
                  "<TD class=\"Q\"><font color=\"red\"><B>".$dif[$i]."</B></font></TD>";
                                     } else {
                                          echo 
                  "<TD class=\"Q\">".$dif[$i]."</TD>"; }
                                    }
                              echo 
                  "</TR>";
                          }        
                                  
                  $min = array();        // Array minuten leeren
                                  
                  $dif = array();        // Array diff leeren
                                  
                  $alt $neu;        // Gruppe wechseln
                              
                  }
                              
                  $min[] = $row['minuten'];    // Daten minuten zwischenspeichern
                              
                  $dif[] = $row['diff'];    // Daten diff zwischenspeichern
                          

                          echo 
                  "<TR><TD class=\"P\">".$row['user']."</TD>";
                      echo 
                  "<TD class=\"Q\">".$row['jahr']."</TD>";
                      echo 
                  "<TD class=\"P\">".$row['minuten']."</TD>";
                      echo 
                  "<TD class=\"Q\">".$row['diff']."</TD></TR>";
                      }
                      else {
                          echo 
                  "<b>Keine Einträge vorhanden</b>\n";
                      }
                    echo 
                  "</table>"
                  Nicht schön, aber funktioniert!


                  Zum oben angesprochnen 'fast'. Nun.., es kann schliesslich vorkommen, dass User erst später dazu gestossen sind und in diesem Falle noch keine 6 Monate dabei sind. Zur Zeit ist es so, dass dann ein '222 2008 289000 0 ' ausgegeben wird. Der Minutenstand und die Differenz also ganz links, er sollte aber - dem Monat entsprechend - ganz rechts sein. Sprich, wenn weniger Datensätze als Abgefragt vorhanden sind, von rechts beginnen die Tabelle zu füllen.

                  Ratschläge, Hilfe, Lynchangebote? *g*

                  Kommentar


                  • #24
                    Tja, das musst du dann noch abfrangen. Ist ja eigentlich kein Problem, oder? (Du lieferst mal wieder nicht den kleinsten Ansatz)

                    Ich würd einfach das die kompletten Daten in ein Array laden:
                    array(username=>array(differenzen))
                    oder
                    array(username=>test, months=>array(differenzen))

                    Damit kannst du wunderbar weiterarbeiten.

                    Kommentar


                    • #25
                      Original geschrieben von medium22
                      Nun.., mittlerweile habe ich mich dazu durchgerungen, die jeweilige Differenz mit zu speichern
                      Das ist wohl die dümmste Idee. Berechnete Daten haben in einer Datenbank nichts verloren.
                      Du kannst ja meinen Code nehmen, und einfach einen zweiten Gruppenbruch einfügen (Den ersten hast du ja schon mit der Berechnung). Da brauchst du auch nichts zwischenzuspeichern:
                      PHP-Code:
                      ....
                      while(
                      $row mysql_fetch_assoc($result)) {
                          
                      $neu $row['user'];
                          if (
                      $alt != $neu) {  
                              if (!empty(
                      $alt)){
                                  echo 
                      "</tr>";
                              }
                              echo 
                      "<tr><td class='P'>" $row['user'] . "</td>";
                              echo 
                      "<td class='Q'>" $row['jahr'] . "</td>";
                          }
                          echo 
                      "<td class='P'>" $row['min'] . "</td>";
                          
                      $diff = ($vmon == 0) ? '&nbsp' $row['min'] - $vmon;
                          if (
                      $diff <= "1500") {
                              
                      $tyle_fmt "<td class=\"Q\"><font color=\"red\"><B>%s</B></font></td>"
                          

                          else {
                              
                      $tyle_fmt "<td class=\"Q\">%s</td>";
                          }
                          
                      printf($style_fmt$diff)  
                          
                      $vmon $row['minuten'];
                      }
                      ... 
                      Gruss
                      H2O

                      Kommentar


                      • #26
                        Hallo,


                        hatte leider die ganze Woche keine Zeit daran weiter zu arbeiten. Nachdem ich nun vieles versucht habe bekomme ich trotzdem eine Fehlerhafte ausgabe nicht weg. Egal wie ich es drehe, wende, umschreibe, .. der Fehler bleibt immer derselbe.

                        Rufe ich die letzten X Monate auf so erscheint die Tabelle (soll sie ja auch *g*) nur mit dem Makel, dass User1 fehlt. An seiner Stelle steht User2 mit den Daten von User1. Also eine Zeile versetzt.., dass zieht sich quer durch die ganze Tabelle und am Ende dieser ist eine Zeile ohne User dafür mit den ganzen Daten.

                        Finde ich äusserst seltsam und ich komme auf keinen Grünen Zweig wo da der Hund begraben liegt.


                        Für solche die bisher nicht hier gelesen haben, hier nochmal der Code dazu

                        PHP-Code:
                        $alt '';
                                
                        $sql "SELECT minuts.user AS user, 
                        minuts.monat AS monat, 
                        minuts.jahr AS jahr, 
                        minuts.minuten AS minuten, 
                        minuts.diff AS diff, 
                        users.UserName AS un, 
                        users.UserId AS uid 
                                    FROM minuts 
                                LEFT JOIN users ON (minuts.user = users.UserId) 
                                    WHERE minuts.jahr = '2008' AND minuts.monat BETWEEN 
                        $raum2 AND $akt 
                                    ORDER BY users.UserName, minuts.monat"

                            
                        // echo "<hr>$sql<hr>";  
                            
                        $result mysql_query($sql) OR die(mysql_error());    
                            if(
                        mysql_num_rows($result)) {

                            
                        $farbe 2;
                                while(
                        $row mysql_fetch_array($result)) {
                                    
                        $neu $row['uid'];
                                    if (
                        $alt != $neu) {        // Gruppenwechsel ?
                                        
                        if($alt != '') {     //Nicht beim ersten Durchgang

                            
                        if (($farbe 2) == 0) {
                                    echo 
                        "<TR><TD class=\"P\" align=\"right\">";
                                    echo 
                        "<a href=\"mins.php?p=e&id=".$row['uid']."\">".$row['un']."</a></TD>";
                                echo 
                        "<TD class=\"P\">".$row['jahr']."</TD>";
                                    for(
                        $i0$i<= $zeit$i++) {
                                            echo 
                        "<TD class=\"P\">".$min[$i]."</a></TD>";
                                        if (
                        $dif[$i] <= "1500") {
                                                echo 
                        "<TD class=\"P\"><font color=\"red\"><B>".$dif[$i]."</B></font></TD>";
                                           } else {
                                                echo 
                        "<TD class=\"P\">".$dif[$i]."</TD>"; }
                                          }
                                    echo 
                        "</TR>";
                            } else { 
                                    echo 
                        "<TR><TD class=\"Q\" align=\"right\">";
                                    echo 
                        "<a href=\"mins.php?p=e&id=".$row['uid']."\">".$row['un']."</a></TD>";
                                    echo 
                        "<TD class=\"Q\">".$row['jahr']."</TD>";
                                    for(
                        $i0$i<= $zeit$i++) {
                                            echo 
                        "<TD class=\"Q\">".$min[$i]."</TD>";
                                        if (
                        $dif[$i] <= "1500") {
                                                echo 
                        "<TD class=\"Q\"><font color=\"red\"><B>".$dif[$i]."</B></font></TD>";
                                           } else {
                                                echo 
                        "<TD class=\"Q\">".$dif[$i]."</TD>"; }
                                          }
                                    echo 
                        "</TR>";
                            }
                        $farbe++;

                                }        
                                        
                        $min = array();        // Array minuten leeren
                                        
                        $dif = array();        // Array diff leeren
                                        
                        $alt $neu;        // Gruppe wechseln
                                    
                        }
                                    
                        $min[] = $row['minuten'];    // Daten minuten zwischenspeichern
                                    
                        $dif[] = $row['diff'];    // Daten diff zwischenspeichern
                                

                                echo 
                        "<TR><TD class=\"P\">".$row['un']."</TD>";
                                echo 
                        "<TD class=\"P\">".$row['jahr']."</TD>";
                                for(
                        $i0$i<= $zeit$i++) {
                               echo 
                        "<TD class=\"P\"><a href=\"mins.php?p=e&id=".$row['uid']."\">".$min[$i]."</a></TD>";
                                  if (
                        $dif[$i] <= "1500") {
                                echo 
                        "<TD class=\"P\"><font color=\"red\"><B>".$dif[$i]."</B></font></TD>";
                                  } else {
                                echo 
                        "<TD class=\"P\">".$dif[$i]."</TD>"
                                      }
                              }
                               echo 
                        "</TR>"
                            }
                            else {
                                echo 
                        "<b>Keine Einträge vorhanden</b>\n";
                            }
                          echo 
                        "</table>"
                        Führe ich diese Abfrage direkt im phpMyA aus, so wird das korrekte Resultat angezeigt, also denke ich mal, dass mein Fehler irgendwo in der Ausgabe liegt.

                        Kommentar


                        • #27
                          Wenn man deinen Code auf die logische Struktur reduziert und ordentlich einrückt, siehst du es selbst.
                          PHP-Code:
                          $alt '';
                          if (
                          mysql_num_rows($result)) {
                              while (
                          $row mysql_fetch_array($result)) {
                                  
                          $neu $row['uid'];
                                  if (
                          $alt != $neu) {        // Gruppenwechsel ?
                                      
                          if ($alt != '') {     //Nicht beim ersten Durchgang
                                          
                          echo $row['un'];
                                      }        
                                      
                          $alt $neu;        // Gruppe wechseln
                                  
                          }
                              } 
                              echo 
                          $row['un'];
                          } else {
                              echo 
                          "<b>Keine Einträge vorhanden</b>\n";

                          Kommentar


                          • #28
                            Vielleicht sollte ich mal wieder schlafen oder eine Wanne voll Kaffee in mich schütten.. Aber ich seh's grad' tatsächlich nicht.. oO

                            Habe eben auch verschiedene Varianten ausprobiert - die Ausgaben in andere Klammer-Teile verschobene - richtig wurde es dadurch aber auch nicht.

                            Kommentar


                            • #29
                              Tja, dann wirst du Testausgaben in jedem If-Else-Zweig machen müssen um herauszufinden, wann welcher Code ausgeführt wird.

                              Kommentar


                              • #30
                                Mir scheint, ich bin tatsächlich zu doof dafür. Egal wie ich es drehe und wende, was ich versuche und umstelle, wo ich Testausgaben mache, etc. es will nicht so wie es soll.

                                Mag mir nicht bitte jemand dabei helfen bzw. dieses eine Mal eine Lösung präsentieren? :/

                                Kommentar

                                Lädt...
                                X