2012-08-07 33 views
5

Ich muss eine Abfrage in MySQL erstellen, die 12 Zeilen (eine Zeile für jeden Monat) zurückgibt, die den Namen des Monats und die Anzahl der Datensätze für den angegebenen Monat wählt. Ich habe zwei Tabellen, ein monates_tbl und events_tbl. Jeder Datensatz in der Tabelle events_tbl verfügt über eine Datetime-Spalte und eine Company_id-Spalte.mysql wählen Sie die Anzahl der Datensätze für jeden Monat

Ich bin derzeit so etwas wie tun (merke ich, haben nicht die WHERE-Klausel company_id noch):

SELECT months_tbl.month, COUNT(events_tbl.event_id) cnt 
FROM months_tbl 
LEFT JOIN events_tbl ON months_tbl.month_id = MONTH(events_tbl.appt_date_time) 
GROUP BY months_tbl.month 
ORDER BY months_tbl.month_id ASC; 

Das gibt etwas wie das, was ich erwarte (12 Zeilen ausgewählt, mit einer Zählung von Ereignisse für den Monat oder Null, wenn es keine gab):

**month** **cnt** 
January  0 
February  0 
March  0 
April  0 
May   0 
June   0 
July   0 
August  88 
September 99 
October  120 
November  0 
December  9 

jedoch gibt es alle Datensätze unabhängig von der Firma zurück. Ich muss sicherstellen, dass die Abfrage von so gefiltert wird, fügte ich die where-Klausel:

SELECT months_tbl.month, COUNT(events_tbl.appt_id) cnt 
FROM months_tbl 
LEFT JOIN events_tbl ON months_tbl.month_id = MONTH(events_tbl.appt_date_time) 
WHERE events_tbl.company_id = 1 
GROUP BY months_tbl.month 
ORDER BY months_tbl.month_id ASC; 

Wenn ich hinzufügen, die where-Klausel meine Ergebnisse werden:

**month** **cnt** 
August  88 
September 99 
October  120 
December  9 

Irgendwelche Ideen, warum ich verliere alle die anderen Monate Datensätze, wenn ich die WHERE-Klausel hinzufügen, obwohl ich eine linke Verknüpfung verwende?

+0

ist Hat meine Lösung Ihnen geholfen? – arnoudhgz

Antwort

6

Sie verwenden einen LEFT JOIN, aber in Ihrem wo Aussage Ihr macht es eine 'normale' JOIN

Versuchen Sie es wie folgt zu schreiben:

SELECT months_tbl.month, COUNT(events_tbl.appt_id) cnt 
FROM months_tbl 
    LEFT JOIN events_tbl ON (months_tbl.month_id = MONTH(events_tbl.appt_date_time) 
    AND events_tbl.company_id = 1 
) 
GROUP BY months_tbl.month 
ORDER BY months_tbl.month_id ASC; 

Notiere die AND events_tbl.company_id = 1 in der LEFT JOIN

Verwandte Themen