我想从3个不同的日期(连续)使用SQL查询统计信息。显示将类似于:
今天创建了15个用户,昨天10个,两天前12个
SQL就像(今天):
SELECT Count(*) FROM Users WHERE created_date >= '2012-05-11'
然后我会在昨天和前一天再做2次查询。
所以我总共对整个数据库进行了3次查询。 created_date的格式为2012-05-11 05:24:11
(日期和时间)。
在一个查询中是否有更有效的SQL方法来执行此操作?
具体来说,我使用的是PHP和SQLite(所以PDO扩展名)。
结果应该是3个不同的数字(每天一个)。
有人可以比较显示一些表现数字吗?
答案 0 :(得分:3)
您可以使用GROUP BY
:
SELECT Count(*), created_date FROM Users GROUP BY created_date
这将为您提供一个日期列表,其中包含该日期的记录数。您可以使用普通created_date
子句为WHERE
添加条件。
修改:
SELECT Count(*), created_date FROM Users WHERE created_date>='2012-05-09' GROUP BY date(created_date)
答案 1 :(得分:1)
最佳解决方案是使用GROUP BY DAY(created_date)
。这是您的查询:
SELECT DATE(created_date), count(*)
FROM users
WHERE created_date > CURRENT_DATE - INTERVAL 3 DAY
GROUP BY DAY(created_date)
答案 2 :(得分:0)
这可行,我相信虽然我无法测试它:
SELECT
(SELECT Count(*) FROM Users WHERE created_date >= '2012-05-11') as today,
(SELECT Count(*) FROM Users WHERE created_date >= '2012-05-10') as yesterday,
(SELECT Count(*) FROM Users WHERE created_date >= '2012-05-11') as day_before
;
答案 3 :(得分:0)
使用像{jeroen建议的GROUP BY
,但是如果您计划其他时段,您还可以设置如下范围:
SELECT SUM(IF(created_date BETWEEN '2012-05-01' AND NOW(), 1, 0)) AS `this_month`,
SUM(IF(created_date = '2012-05-09', 1, 0)) AS `2_days_ago`
FROM ...
如下所述,SQLite没有IF
功能,而是CASE
。所以这应该有效:
SELECT SUM(CASE WHEN created_date BETWEEN '2012-05-01' AND NOW() THEN 1 ELSE 0 END) AS `this_month`,
SUM(CASE created_date WHEN '2012-05-09' THEN 1 ELSE 0 END) AS `2_days_ago`
FROM ...