我有一个查询,它返回每天注册的用户总数。问题是,如果一天没有人注册它不会返回任何值,它只是跳过它。我宁愿它返回零
这是我目前的查询
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
修改
我对数据进行分组,这样我每天都会得到一个计数 - 至于日期范围,我想要在过去七天内注册的用户总数
答案 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()
作为参考日期。但这很容易调整。无论如何,这就是精神......
答案 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执行此操作,因此如何填写日期表(或者您可以动态地执行此操作)是其他人可以回答的。