column_statistics - mysql workbench column-statistics=0



Wie bekomme ich Daten von Mysql für Tage ohne Statistiken zurück? (2)

Ich möchte die Anzahl der Registrierungen aus einem Zeitraum (sagen wir eine Woche) zurückholen, was nicht so schwer ist, aber ich frage mich, ob es in MySQL irgendwie möglich ist, für Tage, die keine haben, eine Null zurückzugeben Registrierungen.

Ein Beispiel: DATEN:

ID_Profile    datCreate
1   2009-02-25 16:45:58
2   2009-02-25 16:45:58
3   2009-02-25 16:45:58
4   2009-02-26 10:23:39
5   2009-02-27 15:07:56
6   2009-03-05 11:57:30

SQL:

    SELECT 
        DAY(datCreate) as RegistrationDate, 
    COUNT(ID_Profile) as NumberOfRegistrations 
    FROM tbl_profile
    WHERE DATE(datCreate) > DATE_SUB(CURDATE(),INTERVAL 9 DAY)
    GROUP BY RegistrationDate
    ORDER BY datCreate ASC;

In diesem Fall wäre das Ergebnis:

RegistrationDate    NumberOfRegistrations
25  3
26  1
27  1
5   1

Offensichtlich fehlen mir ein paar Tage dazwischen. Derzeit löse ich das in meinem PHP-Code, aber ich frage mich, ob MySQL irgendeine Möglichkeit hat, 0 für die fehlenden Tage / Zeilen automatisch zurückzugeben. Dies wäre das gewünschte Ergebnis:

RegistrationDate    NumberOfRegistrations
25  3
26  1
27  1
28      0
1       0
2       0
3       0
4       0
5   1

Auf diese Weise können wir MySQL verwenden, um Probleme bezüglich der Anzahl der Tage in einem Monat zu lösen, anstatt sich auf PHP-Code zu verlassen, um für jeden Monat zu berechnen, wie viele Tage es gibt, da MySQL diese Funktionalität eingebaut hat.

Danke im Voraus

https://ffff65535.com


Dank Paul Dixon fand ich die Lösung. Wer daran interessiert ist, wie ich das gelöst habe, lese weiter:

Erstellen Sie zuerst eine gespeicherte Prozedur, die ich irgendwo gefunden habe, um eine Tabelle mit allen Daten dieses Jahres zu füllen.

CREATE Table calendar(dt date not null);

CREATE PROCEDURE sp_calendar(IN start_date DATE, IN end_date DATE, OUT result_text TEXT)
  BEGIN
    SET @begin = 'INSERT INTO calendar(dt) VALUES ';
    SET @date = start_date;
    SET @max = SUBDATE(end_date, INTERVAL 1 DAY);
    SET @temp = '';
    REPEAT
      SET @temp = concat(@temp, '(''', @date, '''), ');
      SET @date = ADDDATE(@date, INTERVAL 1 DAY);
      UNTIL @date > @max
    END REPEAT;
    SET @temp = concat(@temp, '(''', @date, ''')');
    SET result_text = concat(@begin, @temp);
  END


   call sp_calendar('2009-01-01', '2010-01-01', @z);

   select @z;

Ändern Sie dann die Abfrage, um den linken Join hinzuzufügen:

SELECT
    DAY(dt) as RegistrationDate,
    COUNT(ID_Profile) as NumberOfRegistrations
FROM calendar
LEFT JOIN 
    tbl_profile ON calendar.dt = tbl_profile.datCreate
WHERE dt  BETWEEN DATE_SUB(CURDATE(),INTERVAL 6 DAY)  AND CURDATE()
GROUP BY RegistrationDate
ORDER BY dt ASC

Und wir sind fertig.

Vielen Dank für die schnelle Antworten und Lösung.


Nein, aber eine Problemumgehung wäre die Erstellung einer einspaltigen Tabelle mit einem Datums-Primärschlüssel, der mit Daten für jeden Tag vorinstalliert ist. Sie würden Daten von Ihrem frühesten Ausgangspunkt bis zu einer weit entfernten Zukunft haben.

Jetzt können Sie Ihre statistischen Daten dagegen VERBINDEN - dann erhalten Sie Nullen für diese Tage ohne Daten. Wenn Sie wirklich eine Null anstelle von Null möchten, verwenden Sie IFNULL (Spaltenname, 0).





count