返回零一天没有结果

时间:2013-08-15 18:49:27

标签: mysql sql

我有一个查询,它返回每天注册的用户总数。问题是,如果一天没有人注册它不会返回任何值,它只是跳过它。我宁愿它返回零

这是我目前的查询

SELECT count(*) total FROM users WHERE created_at < NOW() AND created_at > 
DATE_SUB(NOW(), INTERVAL 7 DAY) AND owner_id = ? GROUP BY DAY(created_at) 
ORDER BY created_at DESC

修改

我对数据进行分组,这样我每天都会得到一个计数 - 至于日期范围,我想要在过去七天内注册的用户总数

4 个答案:

答案 0 :(得分:1)

主题为“在线构建7天日历”的变体:

SELECT D, count(created_at) AS total FROM
(SELECT DATE_SUB(NOW(), INTERVAL D DAY) AS D
    FROM
    (SELECT 0 as D
     UNION SELECT 1
     UNION SELECT 2
     UNION SELECT 3
     UNION SELECT 4
     UNION SELECT 5
     UNION SELECT 6
     ) AS D
) AS D
LEFT JOIN users ON date(created_at) = date(D)
WHERE owner_id = ? or  owner_id is null
GROUP BY D 
ORDER BY D DESC

我手边没有你的桌子结构,所以可能需要进行调整。按照相同的想法,您将看到我使用NOW()作为参考日期。但这很容易调整。无论如何,这就是精神......

查看实时演示http://sqlfiddle.com/#!2/ab5cf/11

答案 1 :(得分:0)

如果你有一张可以保存所有日子的桌子,你可以从那里到你的用户桌面进行左连接。

SELECT SUM(CASE WHEN U.Id IS NOT NULL THEN 1 ELSE 0 END)
FROM DimDate D
LEFT JOIN Users U ON CONVERT(DATE,U.Created_at) = D.DateValue
WHERE YourCriteria
GROUP BY YourGroupBy

答案 2 :(得分:0)

有点长的啰嗦,但我认为这会奏效......

SELECT count(users.created_at) total FROM
  (SELECT DATE_SUB(CURDATE(),INTERVAL 6 DAY) as cdate UNION ALL
   SELECT DATE_SUB(CURDATE(),INTERVAL 5 DAY) UNION ALL
   SELECT DATE_SUB(CURDATE(),INTERVAL 4 DAY) UNION ALL
   SELECT DATE_SUB(CURDATE(),INTERVAL 3 DAY) UNION ALL
   SELECT DATE_SUB(CURDATE(),INTERVAL 2 DAY) UNION ALL
   SELECT DATE_SUB(CURDATE(),INTERVAL 1 DAY) UNION ALL
   SELECT CURDATE()) t1 left join users
ON date(created_at)=t1.cdate 
WHERE owner_id = ? or owner_id is null
GROUP BY t1.cdate 
ORDER BY t1.cdate DESC

它与您的查询略有不同,因为它适用于日期而不是查询所执行的日期时间。根据您的描述,我假设您的意思是使用整天,因此使用了日期。

答案 3 :(得分:0)

棘手的一点是,您按数据中的日期字段进行分组,其中可能包含“漏洞”,因此会错过该日期的记录。

解决问题的方法是填写一张表格,其中包含过去10年和接下来100年左右的所有日期,以及(外部)将其加入您的数据。那么你肯定会有每天(或一周或其他)的一条记录。

我只能为MS SqlServer执行此操作,因此如何填写日期表(或者您可以动态地执行此操作)是其他人可以回答的。