即使没有相应的mysql结果,如何计算?

sur*_*190 9 mysql sql

我正在形成一个查询,以提供按日期排序的去年提交的报告数量.我用php获得当前年份和月份:

$year = date('Y') - 1;
$month = date('m');
Run Code Online (Sandbox Code Playgroud)

并执行以下查询:SQL:

SELECT month(date_lm) AS `month` ,
count(*) AS `count`
FROM `reports` 
WHERE (status = 'submitted') 
AND (date_lm > 2012-08) 
GROUP BY month(date_lm) 
ORDER BY month(date_lm) ASC
Run Code Online (Sandbox Code Playgroud)

而且因为去年只提交了1个,所以只给出了1个结果......

| month  |  count  |
|   7    |    1    |
Run Code Online (Sandbox Code Playgroud)

但我希望结果集显示:

| month  |  count  |
|   9    |    0    |
|   10   |    0    |
|   11   |    0    |
|   12   |    0    |
|   1    |    0    |
|   2    |    0    |
|   3    |    0    |
|   4    |    0    |
|   5    |    0    |
|   6    |    0    |
|   7    |    1    |
|   8    |    0    |
Run Code Online (Sandbox Code Playgroud)

那可能吗?

val*_*lex 2

您应该将此表与 1..12 表进行 LEFT JOIN。像这样的东西:

SELECT  Months.id AS `month` ,
COUNT(`reports`.date_lm) AS `count`
FROM 
(
  SELECT 1 as ID UNION SELECT 2 as ID UNION  SELECT 3 as ID UNION SELECT 4 as ID 
  UNION  
  SELECT 5 as ID UNION SELECT 6 as ID UNION SELECT 7 as ID UNION SELECT 8 as ID 
  UNION  
  SELECT 9 as ID UNION SELECT 10 as ID UNION SELECT 11 as ID UNION SELECT 12 as ID
) as Months
LEFT JOIN `reports` on Months.id=month(`reports`.date_lm)
                       AND 
                       (status = 'submitted') 
                       AND (date_lm > 2012-08)
GROUP BY Months.id 
ORDER BY Months.id ASC
Run Code Online (Sandbox Code Playgroud)

SQL Fiddle 演示