PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr (https://www.php-resource.de/forum/)
-   SQL / Datenbanken (https://www.php-resource.de/forum/sql-datenbanken/)
-   -   Daten täglich, wöchentlich oder monatlich auslesen. (https://www.php-resource.de/forum/sql-datenbanken/103370-daten-taeglich-woechentlich-oder-monatlich-auslesen.html)

gruenspan 18-09-2012 12:09

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.

streuner 18-09-2012 12:36

Hi,

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

mfg streuner

gruenspan 18-09-2012 14:57

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

AmicaNoctis 18-09-2012 18:14

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

gruenspan 19-09-2012 11:07

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.

AmicaNoctis 19-09-2012 11:14

Zitat:

Zitat von gruenspan (Beitrag 663213)
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

gruenspan 19-09-2012 20:31

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.

gruenspan 19-09-2012 22:26

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 :(

gruenspan 20-09-2012 10:49

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 »


Alle Zeitangaben in WEZ +2. Es ist jetzt 01:51 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
[c] ebiz-consult GmbH & Co. KG