【问题标题】:SQL COUNT(*) return 0 IFNULL with WHERE clauses and GROUP_BY on same tableSQL COUNT(*) 使用 WHERE 子句和 GROUP_BY 在同一个表上返回 0 IFNULL
【发布时间】:2016-10-11 16:25:27
【问题描述】:

即使计数为null,结果也应返回包含日期的一行。

SELECT DATE_FORMAT(created_date, '%Y-%m') AS date, COUNT(*) AS total
FROM mytable
WHERE created_date BETWEEN :startDate AND :endDate 
AND condition = :condition
GROUP BY DATE_FORMAT(created_date, '%Y-%m')
ORDER BY created_date ASC

我看到我应该使用LEFT JOINIFNULL,但我尝试了没有好的结果。

想要的结果:

array(1) {
  [0]=> {
    ["date"]=>
    string(7) "2016-01"
    ["total"]=>
    string(1) "0"
  }
  [1]=> {
    ["date"]=>
    string(7) "2016-02"
    ["total"]=>
    string(4) "9492"
  }
  [2]=> {
    ["date"]=>
    string(7) "2016-03"
    ["total"]=>
    string(1) "0"
  }
}

PS:我正在使用 MySQL

【问题讨论】:

  • 您正在使用哪个DBMS。厌倦了写这个声明:/
  • 当你说结果应该返回一行时,这是预期的还是期望的结果?
  • @Prdp 抱歉,已编辑
  • @mchev - 实际上你应该标记。我已经为你做了。请记住这一点以备将来的问题

标签: mysql sql count sql-order-by ifnull


【解决方案1】:

LEFT JOIN 是正确的,但是你用什么表做了Left join。您需要一个带有列表日期的calendar

当没有找到特定date 的记录时,您不必使用IFNULL,然后Count 聚合将返回0

SELECT Date_format(c.dates, '%Y-%m') AS date,
       Count(m.created_date)         AS total
FROM   Calendar_table c
       LEFT JOIN mytable m
              ON c.dates = Cast(m.created_date AS DATE)
WHERE  created_date BETWEEN :startDate AND :endDate
       AND condition = :condition
GROUP  BY Date_format(c.dates, '%Y-%m')
ORDER  BY c.dates ASC 

对于创建calendar 表,他是一篇文章:Calendar Tables: An Invaluable Database Tool

【讨论】:

  • 对于这种情况,我没有日历表,无法创建。
  • @mchev - 检查这个问题,有一个选项可以通过创建表格来生成日期stackoverflow.com/questions/14105018/…
  • 这意味着我应该创建一个表并在每个查询中销毁它?我想我会使用 php 选项来检查结果中没有的日期。
  • @mchev - 不,您可以创建一个包含日期列表的永久表,其中有什么问题。该表对报告非常有用
  • 好的,我会检查我是否需要此日历用于其他部分。我不想只为一个查询创建一个大日历表(需要及时走很远)。谢谢;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-04
  • 2011-08-31
  • 2012-05-18
  • 2012-07-03
  • 1970-01-01
相关资源
最近更新 更多