2012-08-07 139 views
5

我需要在mysql中创建一个查询,它将返回12个行(每个月有一行),用于选择月份名称和给定月份的记录数。我有两个表,一个months_tbl和events_tbl。 events_tbl中的每条记录都有一个日期时间列和一个company_id列。mysql选择每个月的记录数

我目前正在做这样的事情(注意我没有WHERE子句COMPANY_ID尚):

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; 

这将返回类似选择什么,我期待(12行,用计数月活动,或零,如果什么都没有):

**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 

但是它返回所有记录,而不管公司。我需要确保查询被这样过滤,我加了where子句:

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; 

当我添加的where子句我的结果变成:

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

任何想法,为什么我失去了所有其他月份记录何时添加where子句,即使我正在使用左连接?

+0

我的解决方案能帮助你吗? – arnoudhgz 2012-08-07 12:07:20

回答

6

您使用的是LEFT JOIN,但在你的WHERE语句您使其成为一个 '正常' JOIN

尝试这样写的:

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; 

注意AND events_tbl.company_id = 1LEFT JOIN