You are not logged in.

  • Login

1

Thursday, December 22nd 2011, 10:42pm

Tageweise Abfrage für eine Statistik

Hi,

ich bin gerade dabei ein paar User Statistiken "zusammenzuklöppeln", allerdings stoße ich da gerade auf ein Problem das ich bisher nicht lösen konnte.
Die vorhandenen Daten stellen sich wie folgt dar: Ich habe eine Tabelle in der - sagen wir mal 100 Einträge drin sind, jeder eintrag hat ein Datum (Datetime) (der Zeitpunkt der erstellung des Eintrages (on update current_timestamp). Meine Abfrage sieht momentan wie folgt aus:

PL/SQL Code

1
2
3
4
5
6
7
8
9
10
11
SELECT DATE_FORMAT(DATE(`registerdate`),'%d.%m.%Y') AS register ,
COUNT(`registerdate`) AS anz 
 
FROM `USER` 
 
WHERE 
`registerdate` != '0000-00-00 00:00:00' AND 
`registerdate` >= DATE_SUB(CURDATE(), INTERVAL 31 DAY)
 
GROUP BY register
ORDER BY register DESC


Die Ausgabe ist an sich schon garnicht mal so schlecht, mein problem ist aber wenn an einem Tag kein Eintrag erstellt wurde, fehlt dieser natürlich in der Ausgabe -->

01.01.2011 - 10
02.01.2011 - 3
04.01.2011 - 11
05.01.2011 - 5
06.01.2011 - 6

^^ so inetwa, was ich nun aber haben möchte ist, das der 03.01.2011 (der in der Liste oben fehlt), eben dieses Datum, auch mit auftaucht mit einer "0" in der Spalte "anz".
Ich habe es auch schon mit `registerdate` between X and Y probiert - das Ergebnis ist das selbe.

Irgendwo habe ich auch mal gelesen das MySQL keine Daten ausgeben kann wo keine existieren ... allerdings will ich das so einfach nicht hinnhemen.
Meine versuche mit einem loop haben keine Ergebnisse gebracht :-(

Ich hoffe Ihr könnt mir da weiterhelfen.

Edit: als letzt - aber auch wirklich aller letzte Möglichkeit, würde ich einfach 31 Abfragen machen - wenn es wirklich nicht mit einer Abfrage möglich sein sollte - was ich aber noch micht glauben will :-) .

This post has been edited 1 times, last edit by "der_robert" (Dec 22nd 2011, 10:51pm)


2

Friday, December 23rd 2011, 9:08am

Irgendwo habe ich auch mal gelesen das MySQL keine Daten ausgeben kann wo keine existieren ...

Genau das würde ich so aber unterschreiben.

Deswegen wäre mein Lösungsvorschlag einfach die Daten zu generieren und mit einem LEFT JOIN dagegen zu joinen.
Erstelle dir eine Tabelle "indexed_days" mit Daten der nächsten 30 Jahre

SQL Code

1
2
3
4
5
6
7
8
9
10
11
12
SELECT DATE_FORMAT(DATE(`registerdate`),'%d.%m.%Y') AS register ,
COUNT(`registerdate`) AS anz 
 
FROM `indexed_days` d
LEFT JOIN `USER` u ON d.`day` = u.registerdate
 
WHERE 
`d` != '0000-00-00 00:00:00' AND 
`d` >= DATE_SUB(CURDATE(), INTERVAL 31 DAY)
 
GROUP BY register
ORDER BY register DESC

3

Tuesday, March 6th 2012, 1:46am

Der Beitrag ist zwar schon etwas älter, ich hätte da aber noch eine Anmerkung.

Quoted from "Torben Brodt"


Erstelle dir eine Tabelle "indexed_days" mit Daten der nächsten 30 Jahre

Und in 30 Jahren funktioniert die Anwendung plötzlich nicht mehr und keiner weiß warum. :)

Ok, wieder ernst: Ich würde die Daten zum joinen lieber dynamisch generieren, zum Beispiel per

SQL Code

1
2
3
4
5
6
7
8
9
SELECT sysdate() - INTERVAL 2 DAY
union
SELECT sysdate() - INTERVAL 1 DAY
union
SELECT sysdate()
union
SELECT sysdate() + INTERVAL 1 DAY
union
SELECT sysdate() + INTERVAL 2 DAY

Das kann man prima in einer Procedure generieren lassen. Wenn man alle Daten eines Monats benötigt, kann man in der Procedure eine Schleife von 1 bis last_day() laufen lassen. Hat man einen beliebigen Zeitraum, kann man mit Datediff() die Anzahl Tage bestimmen usw.

Finde ich etwas eleganter.

Thomas

Similar threads

Social bookmarks