Daten täglich, wöchentlich oder monatlich auslesen.

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

  • Daten täglich, wöchentlich oder monatlich auslesen.

    Hallo zusammen,

    ich habe eine Datenbanktabelle, in der tagesaktuelle Daten hinterlegt werden. Die Daten reichen teilweise bis 1990 zurück. Entsprechend hoch ist die Datenmenge. Bei der Ausgabe der Daten kommt es jedoch zu Performance-Problemen, wenn ein Benutzer einen entsprechend großen Zeitraum wählt.

    Ist es mittels MySQL (oder PHP) möglich z.B. nur jeden ersten Wert eines jeweiligen Monats/Woche auszugeben? Brauche da einen Gedankenanstoss.

  • #2
    Hi,

    zeig mal bitte die Grundstruktur deiner Datenbank + 1-2 Beispieldaten und wie Du darauf zugreifst.

    mfg streuner
    Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
    der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.

    "Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"

    Kommentar


    • #3
      Die Datenbank sieht wie folgt aus:
      Code:
      "ID";"DATUM";"WERT"
      ...
      "144";"1999-02-09 00:00:00";"41.8"
      "144";"1999-02-11 00:00:00";"41.88"
      "144";"1999-02-15 00:00:00";"40.51"
      "144";"1999-02-16 00:00:00";"40.41"
      "144";"1999-02-18 00:00:00";"40.34"
      "144";"1999-02-22 00:00:00";"40.42"
      "144";"1999-02-24 00:00:00";"40.57"
      "144";"1999-02-28 00:00:00";"40.45"
      "144";"1999-03-02 00:00:00";"40.3"
      "144";"1999-03-04 00:00:00";"40.2"
      "144";"1999-03-08 00:00:00";"40.23"
      "144";"1999-03-09 00:00:00";"40.29"
      "144";"1999-03-11 00:00:00";"40.28"
      "144";"1999-03-15 00:00:00";"40.44"
      "144";"1999-03-17 00:00:00";"40.47"
      "144";"1999-03-18 00:00:00";"40.52"
      "144";"1999-03-19 00:00:00";"40.55"
      "144";"1999-03-22 00:00:00";"40.61"
      "144";"1999-03-23 00:00:00";"40.54"
      "144";"1999-03-24 00:00:00";"40.48"
      "144";"1999-03-25 00:00:00";"40.54"
      "144";"1999-03-26 00:00:00";"40.57"
      "144";"1999-03-29 00:00:00";"40.53"
      "144";"1999-03-30 00:00:00";"40.52"
      "144";"1999-03-31 00:00:00";"40.55"
      ...
      Einen konkreten Query haben ich noch nicht, aber die erste Überlegung wäre auf die Eingabe des Nutzers zu reagieren (Anfangs-/Enddatum).
      PHP-Code:
      $query "SELECT * FROM tabelle WHERE DATUM 
      BETWEEN '"
      .$date['minDate']."' AND '".$date['maxDate']."' " 
      Es soll aber je nach Größe des Zeitraums eben nur bspw. ein Wert pro Monat/Woche/Tag genommen werden

      Kommentar


      • #4
        Hallo,

        du kannst mit einer LIMIT-Klausel die Anzahl der auszugebenden Datensätze begrenzen. Wenn du die Ergebnisse auf mehrere Seiten aufteilen willst, wäre „Paginierung“ / „Pagination“ das Stichwort.

        Gruß,

        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


        • #5
          Hallo AmicaNoctis,

          danke für die Antwort. Die Daten werden aber nicht in Tabellen-Form ausgegeben, sondern in einem Chart (highcharts.com). Das Problem ist dann die schiere Masse an Punkten die gerendert werden müssen. Daher auch der Ansatz
          ab einer Gewissen Zeitraum-Größe nur einen Wert pro Monat auszulesen.

          Mittlerweile steht auch fest, dass bei monatlicher Ausgabe immer der letzte Wert des jeweiligen Monats benötigt wird. Das könnte eventuell die Rechnerei etwas erleichtern. Aber mal sehen wie.

          Wäre für weiter Hilfe dankbar.

          EDIT: Es gibt zwar bei highcharts.com eine standardmäßige Gruppierung von Daten im Chart, allerdings werden die Daten dann von mehreren Tagen zusammengefasst und so eine Art Quersumme gebildet um sie dann auf dem Chart abzubilden. Das führt allerdings zu gerundeten und damit in meinem Fall zu falschen Ergebnissen.
          Zuletzt geändert von gruenspan; 19.09.2012, 11:10.

          Kommentar


          • #6
            Zitat von gruenspan Beitrag anzeigen
            Daher auch der Ansatz
            ab einer Gewissen Zeitraum-Größe nur einen Wert pro Monat auszulesen.
            Achso, einer pro Monat. Das war bisher nicht ersichtlich. In diesem Falle hilft das letzte Beispiel auf MySQL :: MySQL 5.1 Reference Manual :: 3.6.4 The Rows Holding the Group-wise Maximum of a Certain Column

            Gruß,

            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


            • #7
              Danke AmicaNoctis,

              ich denke das sollte in etwa diesem Beispiel entsprechen.

              Ich teste das mal und melde mich ggf. bei Rückfragen

              PS. Danke für den Schubs in die richtige Richtung.

              Kommentar


              • #8
                ok, aktuell schaut's so aus:
                PHP-Code:
                SELECT MAX(datum) AS datumpreis
                FROM historie
                WHERE id 
                '123'
                GROUP BY YEAR(datum), MONTH(datum)
                ORDER BY datum DESC LIMIT 0,1000 
                Ergebnisse scheinen auf den ersten Blick relevant. Werd das mal näher prüfen.

                EDIT: Datum richtig, Werte sind die falschen
                Zuletzt geändert von gruenspan; 20.09.2012, 09:40.

                Kommentar


                • #9
                  ok, Lösung gefunden.
                  PHP-Code:
                  SELECT h1.datum AS datumh1.preis AS preis
                    FROM historie h1
                    JOIN 
                  SELECT DATE_FORMAT(datum,'%Y-%m') AS dMAX(DATE_FORMAT(datum,'%d %H:%i:s')) AS dmax 
                            FROM historie
                            GROUP BY DATE_FORMAT
                  (datum,'%Y-%m')
                            
                  ORDER BY NULL 
                         
                  m
                      ON DATE_FORMAT
                  (h1.datum,'%Y-%m') = m.d
                     
                  AND DATE_FORMAT(h1.datum,'%d %H:%i:s') = m.dmax
                     
                  AND h1.id 123
                  ORDER BY h1
                  .datum 
                  Quelle »

                  Kommentar

                  Lädt...
                  X