2012-03-29 18 views
2

Ich mag diese vier Anfragen zu einem kombinieren:MySQL SELECT COUNT überlappende

SELECT COUNT(ID) FROM conversations WHERE DAY(create_time)=DAY(NOW()); 
SELECT COUNT(ID) FROM conversations WHERE WEEKOFYEAR(create_time)=WEEKOFYEAR(NOW()); 
SELECT COUNT(ID) FROM conversations WHERE MONTH(create_time)=MONTH(NOW()); 
SELECT COUNT(ID) FROM conversations WHERE YEAR(create_time)=YEAR(NOW()); 

Diese einzelnen Abfrage zu mir zurückkehren würde, zum Beispiel

Tag => Anzahl der Gespräche von heute,

Wochen => Anzahl der Gespräche ins Gespräch,

Monate => Anzahl der Gespräche ab diesem Monat,

Jahr

Jahr => # Konversationen von diesem Jahr

Ich dachte, ich wäre da mit einigen CASE-Syntax (ich bin kein MySQL-Experte), aber realisiert, dass jeder Datensatz nur in einem Fall gezählt werden konnte, und ich brauche sie zu überlappen. Mit anderen Worten, ich könnte einen einzigen Datensatz für einen dieser Fälle, zwei, drei oder alle vier zählen lassen.

+1

Beachten Sie, dass 'TAG (create_time) = DAY (NOW())' nicht übereinstimmen, wie Sie schreiben, Gespräche von heute, Vielmehr werden Unterhaltungen, die an einem Tag eines Monats erstellt wurden, mit dem des heutigen Datums übereinstimmen. Wenn heute der fünfte von was auch immer ist, wird diese WHERE-Klausel Unterhaltungen entsprechen, die am 5. eines beliebigen Monats eines Jahres in Ihrer Tabelle erstellt wurden. Eine ähnliche Bemerkung gilt für WEEKOFYEAR, MONTH und YEAR. – pilcrow

+0

Das ist eine tolle Info. Gibt es MySQL-Funktionen, die ich stattdessen verwenden sollte, oder sollte ich qualifizierende && Klauseln hinzufügen? – timmyc

+1

Tim, auf die Gefahr der Wiederholung einer Frage in Kommentaren, tun 'DATE (ct) = CURRENT_DATE', 'YEAR (ct) = YEAR (CURRENT_DATE)' und fügen qualifizierte ANDs für die anderen hinzu. * Beachten Sie, dass dies keinen Index für 'create_time' * verwendet. Effizienter, aber anstrengender ist es, die oberen und unteren Grenzen für den aktuellen Tag, die Woche, den Monat und was auch immer zu berechnen und 'WHERE create_time BETWEEN * low * AND * upper *' zu wählen. – pilcrow

Antwort

4
select 
    sum(case when DAY(create_time)=DAY(NOW()) then 1 else 0 end) as DayCount, 
    sum(case when WEEKOFYEAR(create_time)=WEEKOFYEAR(NOW()) then 1 else 0 end) as WeekCount, 
    sum(case when MONTH(create_time)=MONTH(NOW()) then 1 else 0 end) as MonthCount, 
    sum(case when YEAR(create_time)=YEAR(NOW()) then 1 else 0 end) as YearCount 
from 
    conversations 
where 
    YEAR(create_time)=YEAR(NOW()) 

Demo: http://www.sqlfiddle.com/#!2/e62f0/1

1

Schauen Sie sich die Dokumentation für UNION an.
Beispiel Nutzung:

SELECT COUNT(ID) FROM conversations WHERE DAY(create_time)=DAY(NOW()); 
UNION ALL 
SELECT COUNT(ID) FROM conversations WHERE WEEKOFYEAR(create_time)=WEEKOFYEAR(NOW()); 
UNION ALL 
SELECT COUNT(ID) FROM conversations WHERE MONTH(create_time)=MONTH(NOW()); 
UNION ALL 
SELECT COUNT(ID) FROM conversations WHERE YEAR(create_time)=YEAR(NOW());