Hilfe zu JPGraph und Datenbank abfrage

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

  • #16
    Stimmt habe ich auch gerade gesehen, manchmal geht aber auch alles durcheinander...

    So nun sehe ich Balken, aber irgendwie glaub ich nicht, das das so richtig ist...
    https://dl.dropbox.com/u/80052077/Te...g/SQL_Gas8.png

    Also, vielleicht mal von von angefangen!
    Wie sieht denn so eine Abfrage der DB aus, wenn ich den Tagesverbrauch als Balkendiagramm angezeigt bekommen möchte ?

    Mein Anfang:
    PHP-Code:
    $sql "SELECT id, DATE_FORMAT(datumzeit,'%Y.%m.%d') AS DATUM, DATE_FORMAT(datumzeit,'%H:%i:%s') AS ZEIT, GZStand FROM Gas WHERE `datumzeit` >= date_sub(now(), interval 24 hour) AND `datumzeit` <= now()  GROUP BY DATE_FORMAT(datumzeit, '%Y-%m-%d %H:%i') ORDER BY datumzeit DESC";

    $result mysql_query($sql) OR die(mysql_error()); 

    $i=0
    while (
    $array=mysql_fetch_array($result)) { 
        
    $id[$i]=$array[0];
            
    $datum[$i]=strtotime($array[1]);
        
    $GZStand[$i]=$array[2];
    $i++; 

    Die DB sieht so aus:
    id | datumzeit(Typ datetime) | GZStand(Typ float(8,2))
    1 | 2012-12-31 16:30:34 | 8652.56

    Kann mir jemand unter die Arme greifen ?
    Oder müssen wir bei der DB anfangen ?
    Müssen die Daten anders eingetragen werden ?

    Vielen Dank

    Gruß
    Stefan

    Kommentar


    • #17
      Du musst doch im endeffekt nur die differenz zwischen dem heutigen Gasstand und dem gestrigen ermitteln. Dann solltest du schon das haben was du haben wolltest ....

      Kommentar


      • #18
        Ja ich weiß, nur wenn ich das wüsste, wie das geht,
        dann würde ich hier ja nicht um Hilfe bitten.
        Ich weiß ja nicht wie man die DB abfragt so abfragt.

        Please Help

        Danke und ein Frohes neues Jahr....


        Gruß
        Stefan

        Kommentar


        • #19
          Mir fällt da innerhalb der Datenbankabfrage keine Lösung für ein.
          Brauch man aber auch nicht.
          Du kannst das genauso gut im PHP machen.

          PHP-Code:
          $i=0;  
          $temp 0;
          while (
          $array=mysql_fetch_array($result)) {  
              
          $id[$i]=$array[0]; 
                  
          $datum[$i]=strtotime($array[1]); 
              
          $GZStand[$i]= ($array[2]-$temp); 
          $temp $array[2];
          $i++;  

          Dann hast du einzig noch den ersten Wert mit dem Anfangsgasstand.

          Dir und natürlich auch den anderen auch ein frohes neues Jahr.

          Kommentar


          • #20
            Ein frohes, glückliches und gesundes neues Jahr!

            Nimm die Lösung vom bösen Frosch, es geht zwar auch mit reinem SQL, aber die einfache Lösung ist nicht kompatibel und die kompatible Lösung würde zwei Self Left Joins benötigen und wäre damit nicht besonders performant.

            Amica
            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
            Super, danke!
            [/COLOR]

            Kommentar


            • #21
              Hallo AmicaNoctis
              auch wenn die Lösung mit den zwei Self Left Joins nicht performant ist würde mich dennoch die Lösung interessieren.

              Man lernt ja schließlich nie aus

              Also falls du Zeit und Muße hast würde mich das wahrlich interessieren .

              böserfrosch

              Kommentar


              • #22
                Zitat von boeserfrosch Beitrag anzeigen
                Also falls du Zeit und Muße hast würde mich das wahrlich interessieren .
                Okay, also dann:

                Code:
                SELECT
                	g1.*,
                	g2.*,
                	g2.gzstand - g1.gzstand AS delta
                FROM gas AS g1
                LEFT JOIN gas AS g2 ON g2.datumzeit > g1.datumzeit
                LEFT JOIN gas AS g3 ON g3.datumzeit > g1.datumzeit AND g3.datumzeit < g2.datumzeit
                WHERE g3.id IS NULL AND g2.id IS NOT NULL;
                Mit dem ersten Join holt man sich zu jedem linken Datensatz G1 alle rechten Datensätze G2 ins Kreuzprodukt, deren Zeitstempel größer ist. Der zweite Join erweitert das Kreuzprodukt um alle Datensätze G3, die dem Zeitstempel nach zwischen G1 und G2 liegen. Da es ein Left Join ist, wird G3 an den Stellen NULL, wo es keinen Datensatz gibt, der zwischen G1 und G2 liegt, also wo G1 und G2 unmittelbare „Zeitstempelnachbarn“ sind.

                Das wiederum nutzt man in der Where-Klausel aus, indem man alle Datensätze des Kreuzprodukts ignoriert, in denen G3 nicht NULL geworden ist, also G1 und G2 keine Nachbarn sein können, weil es noch etwas dazwischen gab.

                Zu guter Letzt ignorieren wir noch den aktuellsten Datensatz von G1, denn es gibt keinen G2 mehr danach (g2.id IS NOT NULL), mit dem wir ihn vergleichen können und er selbst wurde ja schon mit dem vorletzten verglichen.

                Dass ich immer die Primärschlüsselspalte für IS (NOT) NULL nehme, liegt ganz einfach daran, dass die nie NULL sein darf und damit der beste Kandidat dafür ist, festzustellen, ob aufgrund eines Outer Joins eine der beiden Seiten komplett durchgenullt wurde.

                Amica
                Zuletzt geändert von AmicaNoctis; 01.01.2013, 11:24.
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #23
                  Interessante herangehensweise.

                  Vielen Dank für deine Mühe.

                  Kommentar


                  • #24
                    Hallo Boeserfrosch,
                    erstmal vielen Dank für deine tolle Hilfe.
                    Ich bin jetzt schon ein riesiges Stück weiter und glaube auch nun einiges mehr Verstanden zu haben.
                    Ich habe deinen Befehl jetzt erweitert und bekomme nun die DB Einträge angezeigt,
                    PHP-Code:
                    $sql "
                    SELECT id, DATE_FORMAT(datumzeit,'%Y.%m.%d') AS DATUM, DATE_FORMAT(datumzeit,'%H:%i:%s') AS ZEIT, GZStand 
                    FROM Gas 
                    WHERE `datumzeit` >= date_sub(now(), interval 1 hour) AND `datumzeit` <= now()  
                    GROUP BY DATE_FORMAT(datumzeit, '%Y-%m-%d %H:%i:%s') 
                    ORDER BY datumzeit ASC"
                    // Sortierung -> ASC = 10 9 8 7 6... DESC = 1 2 3 4 5 ...

                    $result mysql_query($sql) OR die(mysql_error()); 

                    $i=0;  
                    $temp_id 0;
                    $temp_datum 0;
                    $temp_uhrzeit 0;
                    $temp_GZStand 0;
                    while (
                    $array=mysql_fetch_array($result)) {  
                         
                    $id[$i] = $array[0]; 
                         
                    $datum[$i] = strtotime($array[1]-$temp1); 
                         
                    $uhrzeit[$i] = $array[2];
                         
                    $GZStand[$i] = $array[3];
                     
                    $temp_id $array[0];
                    $temp_datum $array[1];
                    $temp_uhrzeit $array[2];
                    $temp_GZStand $array[3];

                    $i++;

                     
                    print_r ($temp_id);
                    echo 
                    '&nbsp;';
                     
                    print_r ($temp_datum);
                    echo 
                    '&nbsp;';
                     
                    print_r ($temp_uhrzeit);
                    echo 
                    '&nbsp;';
                     
                    print_r ($temp_GZStand);
                    echo 
                    '<br>';

                    Damit sieht meine Ausgabe nun so aus:
                    https://dl.dropbox.com/u/80052077/Te...g/SQL_Gas9.png

                    Das ist ja schon mal klasse
                    Aber Ich wäre ja nicht hier, wenn ich nicht noch mehr wissen möchte.

                    Also, ich versuche mich gerade daran, die Spalte 'id' in ein ARRAY zu packen, ich weiß aber ach nicht ob das richtig ist, aber weiter, vielleicht wird es ja verständlich...

                    Mit diesem SQL Befehl habe ich die Ausgabe auf 1 Stunde beschränkt:
                    PHP-Code:
                    $sql "
                    SELECT id, DATE_FORMAT(datumzeit,'%Y.%m.%d') AS DATUM, DATE_FORMAT(datumzeit,'%H:%i:%s') AS ZEIT, GZStand 
                    FROM Gas 
                    WHERE `datumzeit` >= date_sub(now(), interval 1 hour) AND `datumzeit` <= now()  
                    GROUP BY DATE_FORMAT(datumzeit, '%Y-%m-%d %H:%i:%s') 
                    ORDER BY datumzeit ASC"

                    Wie bekomme ich die einzelnen id's addiert oder Summiert? in ein 'array' ? (Ich hoffe ihr versteht was ich meine)
                    Bsp:

                    id
                    ---------
                    102
                    103
                    104
                    105
                    106

                    Das array soll dann so aussehen : array(5);

                    Also das sozusagen alle 'id' addiert.

                    Ich hoffe Ihr versteht was ich meine, ich weiß nämlich nicht wonach ich suche
                    Ich dachte da an "array_sum()" aber weiß nicht genau wie ich das einsetzten soll.
                    Weil das addiert ja die Einträge (bei meinem Bsp. 520)


                    @AmicaNoctis
                    Auch Vielen Dank von mir für die Ausführliche Erklärung, wobei ich gestehen mus das ich noch sehr wenig davon verstehe
                    Ich ich werde den jetzt mal zum Testen und verstehen probieren.

                    Besten Dank euch beiden !!

                    Gruß
                    Stefan
                    Zuletzt geändert von Cetax; 01.01.2013, 20:40.

                    Kommentar


                    • #25
                      Durch diese Zeile:
                      PHP-Code:
                      $id[$i] = $array[0]; // Es geht auch $id[$i] = $array["id"]; 
                      packst du bereits alle ID´s in ein Array.

                      Wenn ich dich richtig verstehe willst du nicht die summe der Ids , was auch absolut keinen sinn macht, sondern du möchtest wissen wie viele Einträge in deinem Array sind.

                      Schau dir dazu mal count() an

                      Bei deinem Beispiel mit

                      id
                      ---------
                      102
                      103
                      104
                      105
                      106

                      würde ein count() angewant auf $id[FONT=Palatino Linotype] [/FONT][FONT=Palatino Linotype][COLOR=#000000][COLOR=#006600][/COLOR][COLOR=#0000CC][/COLOR][/COLOR][/FONT] also count($id)
                      eine 5 zurück liefern.

                      Allerdings brauchst du das in diesem fall nochnichtmal tun, da du die anzahl der Daten ja sowieso schon in $i stehen hast.

                      Ich hoffe ich hab dich da jetzt richtig verstanden.

                      Kommentar


                      • #26
                        Hi,
                        hast mich richtigverstanden

                        Ok, verstehe nur zur hälfte...
                        Allerdings brauchst du das in diesem fall nochnichtmal tun, da du die anzahl der Daten ja sowieso schon in $i stehen hast.
                        Wie bekomme ich die dann angezeigt ?
                        Irgendwie stehe ich ganz schön auf dem Schlauch...

                        Also wenn ich
                        PHP-Code:
                        print_r ($id[$i]); 
                        Dann kommt das raus : jztj

                        Kommentar


                        • #27
                          Vor deiner while-Schleife definierst du die Variable $i und weißt ihr den wert 0 zu.

                          Mit der while-schleife gehst du ja ,wie du wahrscheinlich gemerkt hast ,jeden einzelnen deiner Datensätze durch und weißt verschiedene Werte deiner Datensätze verschiedenen Arrays zu.

                          siehe zum Beispiel hier :
                          PHP-Code:
                          $id[$i
                          das $i wird benutz um zu definieren unter welchen schlüssel der jeweilige wert in dem Array abgelegt wird.
                          Damit nicht immer wieder im Array der Wert überschrieben wird muss sich der Schlüssel ändern.
                          Dies wird erreicht durch die inkrementierung der Variable $i
                          siehe
                          PHP-Code:
                          $i++; 
                          wenn die While-Schleife jetzt also fünfmal durchlaufen wird ändert sich der Wert wie folgt:

                          0 <- $i vor while
                          1
                          2
                          3
                          4
                          5 <- Endwert nach fünfmaligen durchlaufen der While-Schleife.

                          $i kannst du jetzt verwenden wie du möchtest.
                          z.B. zum ausgeben:
                          PHP-Code:
                          echo $i

                          Kommentar


                          • #28
                            @boeserfrosch


                            Göttlich ......
                            Mein Retter !!

                            Mehr Info später.....

                            Kommentar


                            • #29
                              Soo...
                              Also meine MySQL-DB frage ich mit folgendem Befehl ab:
                              PHP-Code:
                              SELECT idDATE_FORMAT(datumzeit,'%Y.%m.%d') AS DATUMDATE_FORMAT(datumzeit,'%H:%i:%s') AS ZEITGZStand 
                              FROM Gas 
                              WHERE DATE
                              (datumzeit) = DATE(NOW())
                              GROUP BY DATE_FORMAT(datumzeit'%Y-%m-%d %H:%i:%s'
                              ORDER BY datumzeit ASC"; 
                              Damit zeige ich den Verbrauch von Heute an.

                              Vielen Dank @boeserfrosch für die tolle Hilfe hier im Forum.



                              Gruß
                              Stefan
                              Zuletzt geändert von Cetax; 06.01.2013, 23:04.

                              Kommentar


                              • #30
                                @Cetax, wenn du so zufrieden bist, hast du sicher die 5 Sekunden Zeit, dem Bösen Frosch deinen Dank durch eine Bewertung des ausschlaggebenden Beitrags (über das Waage-Symbol oben rechts) kund zu tun
                                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                                Super, danke!
                                [/COLOR]

                                Kommentar

                                Lädt...
                                X