查询单独数据日的有效方法?

时间:2012-05-11 16:55:16

标签: sql performance pdo

我想从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个不同的数字(每天一个)。

有人可以比较显示一些表现数字吗?

4 个答案:

答案 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 ...