当DAY在同一个表中的MySQL组在计数零时不工作

时间:2015-04-05 13:37:57

标签: mysql sql

当COUNT(*)结果返回0行

时,我的以下查询不返回行
SELECT COUNT(id) test,
       UNIX_TIMESTAMP(my_time)*1000 d 
FROM chat_table 
WHERE dept_id = 5 
   AND my_time >="2015-03-30" 
GROUP BY DAY(my_time) 
ORDER BY d ASC;

我需要GROUP BY日甚至返回0行。怎么可以加入同一个表?或任何想法?

2 个答案:

答案 0 :(得分:1)

您只能拥有基于存在的值的组。如果您的表中不存在值,例如timestamp'2015-04-01 12:00:00',则它不能成为结果的一部分。

您可以通过以下方式解决此问题:

  • 以编程语言处理查询结果,为所有缺失的行补充计数0
  • 或创建包含所有时间戳的参考表
  • 或者使用子查询和联合手动注入所有时间戳。

最好的选择是第一个:保持查询不变,但在程序中编写逻辑,启动查询,如果时间戳不在结果集中,则自动假设计数为零。

例如,在PHP中:

$countsPerTimestamp = array();
foreach ($stmt->fetchAll() as $row) {
    $countsPerTimestamp[$row['d']] = $row['test'];
}

$searchTimestamp = '2015-04-05 12:13:14';
if (isset($countsPerTimestamp[$searchTimestamp])) {
    echo 'Count for now is: ' . $countsPerTimestamp[$searchTimestamp];
}
else {
    echo 'Count for now is: 0';
}

答案 1 :(得分:0)

如果您的表每天都有数据,但where子句将其过滤掉,那么最简单的解决方案是使用条件聚合:

SELECT SUM(dept_id = 5) as test,
       UNIX_TIMESTAMP(my_time)*1000 as d 
FROM chat_table 
WHERE my_time >= '2015-03-30'
GROUP BY DAY(my_time) 
ORDER BY d ASC;

如果这些条件不成立,那么您需要从所有日期的列表开始并使用left join