Vinzenz Mai: SQL statt PHP

Beitrag lesen

Hallo Christian,

warum machst Du uns, Deinem Server und Dir selbst das Leben so schwer?

  

> $query = "SELECT date FROM training ORDER BY date LIMIT 1";  
  
[...] Es folgt eine Menge unkommentierten PHP-Codes ...  
  
... mit dem Einsatz einer undokumentierten Funktion:  

>     $week = week($firstweek, $firstyear);  
  
...  
  

> while ($weekstart <= $now) {  
  
... und dem Absetzen von Abfragen an die Datenbank in einer Schleife, ...  
  

>   $query = "SELECT * FROM training WHERE date >= '".$weekstart."' AND date <= '".$weekend."' ORDER BY date";  
  
... bei der viele, viele Daten abgefragt werden, "SELECT * " ist ja so bequem ...  
  

>   $result = mysql_query($query);  
  
... mögliche Fehler munter ignoriert werden,  
  
  

>   while($row = mysql_fetch_object($result))  
>     {$date = $row->date;  
  
... offensichtlich ein einziges Feld interessiert ...  
  

>     $numberofresults = mysql_num_rows($result);  
  
... und die Anzahl der Datensätze, während der Rest weggeworfen wird ...  
  

> }  
  
und da Du irgendwo noch einen Fehler eingebaut hast, darfst Du Dich nicht wundern, dass Dein Skript viel zu lange braucht und zwangsweise beendet wird.  
  
Ich vermute, Du möchtest in Erfahrung bringen, wieviele Einträge je Kalenderwoche und Jahr es in der Tabelle in einem bestimmten Zeitraum gibt. Wenn ja, so kannst Du dies mit einer relativ einfachen SQL-Abfrage bekommen, ohne irgendwelche überflüssigen PHP-Verrenkungen zu machen:  
  
Da Du Deine Zeitangaben als UNIX-Timestamp abgespeichert hast, für den meiner  
Meinung nach nichts spricht, als dass er in diversen Programmiersprachen  
bequem zu bekommen ist, ist noch etwas zusätzlicher Aufwand erforderlich.  
Grundsätzlich bin ich der Ansicht, dass man Datums- und Zeitangaben in  
Datenbanken in Feldern entsprechenden Typs abspeichern sollte.  
  
Zurück zu Deinem Problem:  
  
Ein einziges Mal ausgeführt, sollte Dir  
  
[code lang=sql]SELECT  
    -- ermittle die Kalenderwoche  
    [link:http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_week@title=WEEK]([link:http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_from-unixtime@title=FROM_UNIXTIME](date)) AS Woche,  
    -- ermittle den Jahresanteil  
    [link:http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_year@title=YEAR](FROM_UNIXTIME(date)) AS Jahr,  
    -- zähle wieviele Einträge es davon gibt  
    [link:http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_count@title=COUNT](date) AS Anzahl  
FROM training  
-- in einem bestimmten, von Dir vorgegebenen Zeitraum (hier als UNIX-Timestamps  
WHERE date [link:http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_between@title=BETWEEN] dein_start AND dein_ende  
-- gruppiert nach Kalenderwoche und Jahr, d.h. für jede Kombination von  
-- Kalenderwoche und Jahr genau eine Zeile  
GROUP BY Woche, Jahr

Dein Ergebnis liefern. Möchtest Du das Ergebnis über die kompletten Daten Deiner Tabelle sehen, so lass die WHERE-Klausel einfach weg.

Freundliche Grüße

Vinzenz