0

我想使用 SQL 从 3 个不同的日子(连续)查询统计信息。显示将类似于:

今天创建了 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

4 回答 4

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)
于 2012-05-11T17:06:10.063 回答
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)
于 2012-05-11T17:11:32.650 回答
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
;
于 2012-05-11T17:06:21.283 回答
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 ...
于 2012-05-11T17:08:52.923 回答