2016-07-07 79 views
0

我有这样的查询:为什么SUM()在没有行被选中时返回NULL?

SELECT sum(date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 day))) as num_day 
FROM mytable 
WHERE user_id = :id 

SUM()返回NULL当选择了现在的行。我的意思是当:id不存在于mytable中时,num_day的结果是NULL。 根据我的需要,根本不应该是NULL。它应该是0或更多。

无论如何,我如何计算一个条件的真实数?这里是条件:

date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 day)) 
+0

内 - 因为*空集*的总和是不确定的和/或无意义的。 – deceze

+0

@deceze在这种情况下,获得'0'而不是'null'的最佳方式是什么? –

回答

2

最简单的事情是一个ifnull()来包装它在null

ifnull(sum(date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 day))), 0) 
+0

是或'COALESCE()'。但实际上我想知道,我可以通过count()而不是sum()来做到吗? –

+0

是的,看看@ bukko的回答 – Ray

+0

谢谢... upvote –

2

的情况下返回0这是你的意思?

SELECT COUNT(*) AS num_day 
FROM mytable 
WHERE user_id = :id 
AND date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 day)) 

如果没有东西加起来,SUM()将返回null。 COUNT将返回实际的数字,如果没有,则返回0。

+1

这是一个很好的解决方案。该查询可以利用'mytable(user_id,date_time)'上的索引。 –

+0

谢谢.. upvote –

+0

那么这里是[我的查询](https://gist.github.com/anonymous/0b2b48e8f6ea7dd2a6e7e53e521f0b29)在现实中,我可以写你喜欢的东西吗? –

0
SELECT sum(if(date_time > unix_timestamp(DATE_SUB(now(), INTERVAL 1 day))),1,0) as num_day 
FROM mytable 
WHERE user_id = :id 

使用这样的查询。

+1

你能否将代码格式化为代码? – trincot

+0

我从移动应答,所以没有dormat选项,你可以请,我会批准编辑。 –

+0

当选择行时,它仍然返回NULL。 –

1

我该如何计算条件的真实数?这里是条件: “为什么?是吧`NULL`”

使用CASE条件SUM

SELECT sum(CASE WHEN date_time > unix_timestamp(DATE_SUB(now(), 
                  INTERVAL 1 day)) 
         THEN 1 
       ELSE 0 
      END 
     ) as num_day 
+0

如果没有选择行,它仍返回NULL。 –

+0

我想你必须在SUM()'之外使用'CASE'。 –

+0

在这种情况下,您不得不添加'IFNULL'或'COALESCE',这与@bukko解决方案之间的区别是....如果您需要不同的条件'COUNT(*)',则不能将其放在'在哪里......例如'SUM(month = 1月),SUM(month = 2月)' –