2012-05-14 7 views
10

Ich habe SQL wie folgt aus (wo $ytoday 5 Tagen ist):Wie enthalten GROUP BY und COUNT Nullsummen?

$sql = 'SELECT Count(*), created_at FROM People WHERE created_at >= "'. $ytoday .'" AND GROUP BY DATE(created_at)'; 

Ich möchte dies für jeden Tag einen Wert zurückgeben, so dass es 5 Ergebnisse in diesem Fall zurückkommen würde (5 Tage vor bis heute) .

Aber sagen Count(*) ist 0 für gestern, anstatt eine Null zurückgibt es überhaupt keine Daten für dieses Datum zurückgibt.

Wie kann ich diese SQLite-Abfrage so ändern, dass sie auch Daten mit einer Anzahl von 0 zurückgibt?

+0

all Wählen Sie die Zeilen, die Sie zuerst wollen, dann eine Zählung auf diesen Reihen laufen (links kommt vielleicht) – keyser

Antwort

9

Ohne gewunden (meiner Meinung nach) Abfragen, Ihre Ausgangsdaten-Satz gewonnen‘ t Geben Sie Daten ein, die in Ihrem Eingabedatensatz nicht vorhanden sind. Dies bedeutet, dass Sie einen Datensatz mit den 5 Tagen benötigen, an dem Sie teilnehmen können.

Die einfache Version wäre, eine Tabelle mit den 5 Daten zu erstellen und sich daran anzuschließen. Normalerweise erstelle und behalte ich (effektiv im Cache) eine Kalender-Tabelle mit jedem Datum, das ich jemals brauchen könnte. (wie von 1900.01.01 bis 2099.12.31.)

SELECT 
    calendar.calendar_date, 
    Count(People.created_at) 
FROM 
    Calendar 
LEFT JOIN 
    People 
    ON Calendar.calendar_date = People.created_at 
WHERE 
    Calendar.calendar_date >= '2012-05-01' 
GROUP BY 
    Calendar.calendar_date 
+0

Hmm, scheint einfach genug. Das sind immer die letzten 5 Tage, also würde eine statische Tabelle nicht funktionieren. Gedanken? – JBurace

+0

@JBurace - Eine statische Tabelle funktioniert. Sie ändern nur Ihre WHERE-Klausel. Zum Beispiel zeigt meins "jedes Datum seit' '2012-05-01'' "weil ich faul bin und in dieser WHERE-Klausel keinen 5-Tage-Bereich angegeben habe. Dann tun Sie, wie Sie bereits sind, und bauen Sie die WHERE-Klausel nach Ihren Bedürfnissen. – MatBailie

+0

Hmm, okay. Ich dachte, 'erstellen Sie eine Tabelle mit den 5 Daten 'bedeutete, eine Tabelle mit nur 5 Einträgen zu erstellen. – JBurace

4

Sie müssen links Join gegen eine Liste von Daten. Sie können entweder eine Tabelle mit den Daten erstellen Sie es brauchen, oder Sie können den dynamischen Ansatz ich hier skizziert:

generate days from date range