我的原始查询如下:
SELECT COUNT(*) AS count, YEAR(created_at) AS "year", MONTH(created_at) AS "month"
FROM quotes WHERE
(YEAR(created_at) = YEAR(CURDATE()) AND MONTH(created_at) = MONTH(CURDATE())
OR YEAR(created_at) = YEAR(CURDATE()) AND MONTH(created_at) = MONTH(CURDATE()) -1)
AND status_id = 1
GROUP BY YEAR(created_at), MONTH(created_at) DESC
此查询基本上会检索本月和上个月的COUNT
并且工作正常,除非两个月都没有结果。
除了数周和数年之外,我有两个类似的查询。
我已尝试使用COALESCE
和IFNULL
,但似乎并未包含NULL
个结果。
SELECT IFNULL(COUNT(*), 0) AS count, YEAR(created_at) AS "year", MONTH(created_at) AS "month"
FROM quotes
WHERE
(YEAR(created_at) = YEAR(CURDATE()) AND MONTH(created_at) = MONTH(CURDATE()) OR YEAR(created_at) = YEAR(CURDATE()) AND MONTH(created_at) = MONTH(CURDATE()) -1)
AND status_id = 1
GROUP BY YEAR(created_at), MONTH(created_at) DESC
实际结果
count | year | month
-----------------------
1 | 2014 | 11
预期结果
count | year | month
-----------------------
1 | 2014 | 11
0 | 2014 | 10
答案 0 :(得分:0)
您需要为想要查看的月份使用单独的数据集。您的SQLfiddle只是对Quotes
上的行进行分组,因此不会显示几乎没有在结果集中显示的月份的汇总行。
使用您想要的月份尝试Creating a temporary table,然后执行简单的OUTER JOIN以选择出现的任何引号。
答案 1 :(得分:0)
只需在SUM功能中移动IFNULL,就像建议的评论一样,不够。 您只能按可用值进行分组。如果2014-10没有参赛作品,您将无法打印任何内容。 否则你会看到所有可能的组合。
注意:where子句仅限制结果,它对要显示的内容没有影响。 Select doens&#t;#34;知道"它必须显示月份10. becuas ethere在那里没有价值。
我不知道你想要达到什么目标,但在这种情况下,如果根本没有匹配的结果,我只会在程序中打印0。
答案 2 :(得分:0)
最简单的......
SELECT x.month , COUNT(q.id) total FROM (SELECT 10 month UNION SELECT 11) x LEFT JOIN quotes q ON MONTH(created_at) = month GROUP BY month;