MySQL Statistik jeden Tag eines Monats mit einer Abfrage

MDX

Mitglied
Hallo,
ich möchte eine Art Statistik für Aufrufe pro Artikel machen.
Diese soll die Aufrufzahlen pro Monat beeinhalten (also z.B.: Jan=23, Feb=45, Mär=66 etc.).
Dies funktioniert auch ohne Probleme.
Nun soll, wenn man auf den Monat klickt eine neue Seite geöffnet werden, wo jeweils alle Tage des Monats mit den Daten dafür angezeigt werden (also z.B.: 1 Jan=1, 2 Jan=3, 3 Jan = 5, 4 Jan = 0 etc.)
Das Problem ist, dass wenn ich für jeden einzelnen Tag eine Abfrage mache, die Seite extrem lange zum Laden benötigt. Deshalb dachte ich mir das es eventuell möglich sein müsste die Daten aus der DB in ein Array zu laden und diese Daten dann tageweise ausgeben zu lassen.
Meine Idee währe irgendwas mit DATE_FORMAT.
Kann aber auch sein, dass ich komplett falsch liege...

Ich währe sehr dankbar wenn mir jmd. helfen könnte... (wahrscheinlich ist es viel einfacher als ich denke )

MFG
Dave
 
Für den Februar 2010
PHP:
$sql = 'SELECT DATE(myDateField) AS date, SUM(*)
    FROM myTable
    WHERE EXTRACT(YEAR_MONTH FROM myDateField) = 201002
    GROUP BY DATE(myDateField)';
$result = mysql_query($sql);
while($row = mysql_fetch_array($result)){
    $days[] = $row;
}
 
  • Gefällt mir
Reaktionen: MDX
Normalerweise solltest du keine Geschwindigkeitsveränderungen feststellen, schließlich sind es NUR ca. 30 SQL-Abfragen ( es sei denn, du entwickelst auf einer lahmen Ente vom Baujahr 1950 v.Chr)

Ich vermute dein SQL ist nicht korrekt. Selbstverständlich ist es ratsam die Daten abzuholen und auf PHP-Ebene in einer Schleife nach Übereinstimmungen zu durchforsten.

PS.: Niemals die Tage des Monats mit +1 hochzählen. Lösung: strtotime("+1 day")
 
Nur ca 30 Abfragen. Das sind 29 zu viel. Bei einem User sind es 29, bei 10 sind es 290 etc.

Jede Abfrage kostet Performance. Jeder Zugriff, jede Übertragung.
SQL ist gut eingesetzt ein mächtiges Werkzeug das dir Viel arbeit abnehmen kann. Ein grösseres Komplexeres aber sinnvolles SQL-Statement ist besser.
Möglichst mit einem Zugriff die Informationen ins PHP übernehmen und dort weiter verarbeiten.

Alles andere funktioniert, ist aber eine Beleidigung für jede Datenbank und Geschwindigkeit.
 
@yaslaw:
Danke dir schonmal, das ist genau was ich wollte :D

Wenn du gerade Zeit hast, währe ich sehr dankbar wenn du mir noch Helfen könntest de Daten richtig auszugeben:

PHP:
$sql = "SELECT  SUM(count), DATE(gedate) AS date FROM views WHERE video_id LIKE '1' AND EXTRACT(YEAR_MONTH FROM gedate) = 201002 GROUP BY DATE(gedate)";
$result = mysql_query($sql);
while($row = mysql_fetch_array($result)){
    $days[] = $row;
}

So, dass ist der SQL Code, dass alles richtig aus der DB gelesen wird.
Nur werden ja jetzt Tage, wo kein Aufruf war ignoriert und der 17.02.2010 wird nun mit $days[0] aufgerufen.
Ich würde nun gerne diese Daten in folgendem XML-Code ausgeben lassen (Schleife):
HTML:
  <daystat name='TAG' hoverText='TAG.<?=date("m.Y")?>: AUFRUFE' value='AUFRUFE' />
Für jeden Tag, auch wenn kein Aufruf an diesem Tag war.
Anzahl der Tage über folgenden Code ermittelt:
PHP:
$month = date("F");
$day = date("d");
$year=date("Y");
$numdays = date('t',strtotime("$month $day $year"));
 
Ich habe jetzt einfach rasch was hingeschmiert und nicht getestet. Es ist sicher noch verbesserungsfähig

PHP:
<?
//Simulation der Auswahl
$month = 2;
$year = 2010;
$searchDate = mktime(0, 0, 0, $month, 1, $year);
$yearMonth = date('Ym',$searchDate);

//Abfragen der Daten
$sql = "SELECT  SUM(count) AS count, DAYOFMONTH(DATE(gedate)) AS day 
		FROM views 
		WHERE video_id LIKE '1' AND EXTRACT(YEAR_MONTH FROM gedate) = '{$yearMonth}' 
		GROUP BY DATE(gedate)";
$result = mysql_query($sql);
//Alle Daten in ein Array mit dem Tag als key schreiben
while($row = mysql_fetch_object($result)){
    $days[$row->day] = $row;
}  

//Letzter Tag des Monats ermitteln. 
$lastDayOfMonth = mktime(0, 0, 0, $month, 0, $year);

for ($i=1; $i <= date('j', $lastDayOfMonth); $i++){
	$date = mktime(0, 0, 0, $month, $i, $year);
	//Falls ein Eintrag im Array exisitiert, diesen nehmen. Ansonsten 
	$count = ($days[$i]) ? $days[$i]->count : 0;
	//TODO Infos ausgeben 
}
?>
 
  • Gefällt mir
Reaktionen: MDX
Hallo, dein Code funktioniert (fast) perfekt.

Einziges Makro:
Komischerweise erhalte ich immer 31 Zeilen, d.h. im Februar, März, April etc.
Auch wenn der Monat nur 30 oder 28 Tage hat.
Dort steht dann eben schon der Tag des nächsten Monats:
Code:
<set name="30" hoverText="30.11.2012: 0 Aufrufe" value="0" />
<set name="31" hoverText="01.12.2012: 0 Aufrufe" value="0" />
 
Ok, habe es jetzt mit einem anderen Code hinbekommen, statt
PHP:
for ($i=1; $i <= date('j', $lastDayOfMonth); $i++){
einfach:
PHP:
for ($i=1; $i <= date('t',  $searchDate); $i++){

Vielen Dank @ yaslaw
 
By the way:
Speichere den Wert, den Dir die date-Funktion zurückgibt, in eine Variable, um die Performance zu steigern. Ansonsten wird die Funktion jedesmal aufgerufen, solange die for-Schleife läuft:

$date = date('t', $searchDate);
for ($i=1; $i <= $date; $i++){
 
Ja, hab ich ja auch so gemacht, war nur zu Faul um alles zu kopieren, da ich das ein bisschen anderst Strukturiert habe :D
 
Zurück