Tageweise Abfrage für eine Statistik

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

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

    Quellcode

    1. select DATE_FORMAT(DATE(`registerdate`),'%d.%m.%Y') as register ,
    2. count(`registerdate`) as anz
    3. from `user`
    4. where
    5. `registerdate` != '0000-00-00 00:00:00' and
    6. `registerdate` >= DATE_SUB(CURDATE(), INTERVAL 31 DAY)
    7. group by register
    8. order by register desc
    Alles anzeigen


    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 :-) .

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von der_robert ()

  • der_robert schrieb:

    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

    Quellcode

    1. SELECT DATE_FORMAT(DATE(`registerdate`),'%d.%m.%Y') AS register ,
    2. COUNT(`registerdate`) AS anz
    3. FROM `indexed_days` d
    4. LEFT JOIN `USER` u ON d.`day` = u.registerdate
    5. WHERE
    6. `d` != '0000-00-00 00:00:00' AND
    7. `d` >= DATE_SUB(CURDATE(), INTERVAL 31 DAY)
    8. GROUP BY register
    9. ORDER BY register DESC
    Alles anzeigen
  • Der Beitrag ist zwar schon etwas älter, ich hätte da aber noch eine Anmerkung.

    Torben Brodt schrieb:


    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

    Quellcode

    1. select sysdate() - INTERVAL 2 DAY
    2. union
    3. select sysdate() - INTERVAL 1 DAY
    4. union
    5. select sysdate()
    6. union
    7. select sysdate() + INTERVAL 1 DAY
    8. union
    9. 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