798 Stimmen

MySQL-Abfrage GROUP BY Tag / Monat / Jahr

Ist es möglich, eine einfache Abfrage zu erstellen, um zu zählen, wie viele Datensätze ich in einem bestimmten Zeitraum wie einem Jahr, einem Monat oder einem Tag habe, wobei eine TIMESTAMP Feld, wie:

SELECT COUNT(id)
FROM stats
WHERE record_date.YEAR = 2009
GROUP BY record_date.YEAR

Oder sogar:

SELECT COUNT(id)
FROM stats
GROUP BY record_date.YEAR, record_date.MONTH

Um eine monatliche Statistik zu haben.

Gracias.

1229voto

codelogic Punkte 68703
GROUP BY YEAR(record_date), MONTH(record_date)

Überprüfen Sie die Datums- und Zeitfunktionen in MySQL.

289voto

Andriy M Punkte 73604
GROUP BY DATE_FORMAT(record_date, '%Y%m')

Note (in erster Linie für potenzielle Abwähler). Im Moment ist dies vielleicht nicht so effizient wie andere Vorschläge. Dennoch lasse ich es als eine Alternative stehen, die auch dazu dienen kann, zu sehen, wie schnell andere Lösungen sind. (Denn man kann nicht wirklich schnell von langsam unterscheiden, bis man den Unterschied sieht.) Außerdem könnten im Laufe der Zeit Änderungen an der MySQL-Engine im Hinblick auf die Optimierung vorgenommen werden, so dass diese Lösung zu einem (vielleicht nicht so fernen) Zeitpunkt in der Zukunft in ihrer Effizienz mit den meisten anderen vergleichbar wird.

58voto

fu-chi Punkte 581

Versuchen Sie dies

SELECT COUNT(id)
FROM stats
GROUP BY EXTRACT(YEAR_MONTH FROM record_date)

EXTRACT(unit FROM date) Funktion ist besser, da weniger Gruppierung verwendet wird und die Funktion einen Zahlenwert zurückgibt.

Die Vergleichsbedingung bei der Gruppierung ist schneller als die Funktion DATE_FORMAT (die einen String-Wert zurückgibt). Versuchen Sie, für SQL-Vergleichsbedingungen (WHERE, HAVING, ORDER BY, GROUP BY) Funktionen zu verwenden, die einen Nicht-String-Wert zurückgeben.

49voto

dimazaid Punkte 1633

Ich habe versucht, mit der "WHERE"-Anweisung oben, ich dachte, seine richtige, da niemand korrigiert, aber ich war falsch; nach einigen Recherchen fand ich heraus, dass dies die richtige Formel für die WHERE-Anweisung, so dass der Code wird wie folgt:

SELECT COUNT(id)  
FROM stats  
WHERE YEAR(record_date) = 2009  
GROUP BY MONTH(record_date)

41voto

mr.baby123 Punkte 2040

Wenn sich Ihre Suche über mehrere Jahre erstreckt und Sie trotzdem monatlich gruppieren möchten, schlage ich vor, dass Sie eine Gruppe bilden:

Version #1:

SELECT SQL_NO_CACHE YEAR(record_date), MONTH(record_date), COUNT(*)
FROM stats
GROUP BY DATE_FORMAT(record_date, '%Y%m')

Version #2 (effizienter) :

SELECT SQL_NO_CACHE YEAR(record_date), MONTH(record_date), COUNT(*)
FROM stats
GROUP BY YEAR(record_date)*100 + MONTH(record_date)

Ich habe diese Versionen an einer großen Tabelle mit 1.357.918 Zeilen verglichen ( innodb ), und die 2. Version scheint bessere Ergebnisse zu erzielen.

Version1 (Durchschnitt von 10 Durchläufen) : 1,404 Sekunden
Version2 (Durchschnitt von 10 Durchläufen) : 0,780 Sekunden

( SQL_NO_CACHE Schlüssel hinzugefügt, um zu verhindern, dass MySQL auf Abfragen CACHING betreibt).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X