Sha*_*ank 4 mysql phpmyadmin php date-format
我的表结构:
+-----------------+--------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| user | varchar(100) | NO | | NULL | |
| uniq_name | varchar(100) | NO | | NULL | |
| info_name | varchar(100) | NO | | NULL | |
| delay_time | int(11) | NO | | NULL | |
| track_time | timestamp | NO | | CURRENT_TIMESTAMP | |
+-----------------+--------------+------+-----+-------------------+----------------+
Run Code Online (Sandbox Code Playgroud)
我必须从表中检索过去 7 天的数据,而不是总和。特定日期的数据,为此我现在必须使用 like 运算符七次触发相同的查询:
SELECT COUNT(DISTINCT `user`) FROM `tracks` WHERE `track_time` LIKE '2012-11-12%';
Run Code Online (Sandbox Code Playgroud)
这不是一个好方法。我正在尝试自己做,也在论坛上讨论过,它可能是用IN运算符完成的,也可能是使用 date1 < date2 < ....date 过去 7 天。为此,我在 PHP 中使用了一个函数,在该函数中我提供了一个日期参数,但查询将花费大量时间在 Web 上显示结果。请看一下这种情况。
如果您正在执行一系列连续日期,则无需使用IN运算符。
如果你用它来计算 7 天前的午夜
DATE(NOW()) - INTERVAL 7 DAY + INTERVAL 0 SECOND
Run Code Online (Sandbox Code Playgroud)
这是你得到的回报:
mysql> SELECT DATE(NOW()) - INTERVAL 7 DAY + INTERVAL 0 SECOND;
+--------------------------------------------------+
| DATE(NOW()) - INTERVAL 7 DAY + INTERVAL 0 SECOND |
+--------------------------------------------------+
| 2012-11-21 00:00:00 |
+--------------------------------------------------+
1 row in set (0.01 sec)
mysql>
Run Code Online (Sandbox Code Playgroud)
您的查询将如下所示:
SELECT COUNT(DISTINCT `user`) FROM `tracks`
WHERE `track_time` >= ( DATE(NOW()) - INTERVAL 7 DAY + INTERVAL 0 SECOND );
Run Code Online (Sandbox Code Playgroud)
您还需要一个索引来支持WHERE和COUNT
ALTER TABLE tracks ADD INDEX track_time_user_ndx (track_time,user);
Run Code Online (Sandbox Code Playgroud)
然后,查询应该更快。
如果您正在处理某个较早时期的一系列连续日期,只需提供从午夜到午夜的第一个和最后一个日期。例如,对于范围2012-11-12为2012-11-19:
SELECT COUNT(DISTINCT `user`) FROM `tracks`
WHERE `track_time` >= '2012-11-12 00:00:00'
AND `track_time` < '2012-11-19 00:00:00';
Run Code Online (Sandbox Code Playgroud)
如果您正在执行一系列非连续日期,只需使用UNION. 例如,对于日期2012-11-12, 2012-11-19, 2012-11-26:
SELECT COUNT(DISTINCT `user`) FROM
(
SELECT user,track_time FROM `tracks`
WHERE `track_time` >= '2012-11-12 00:00:00'
AND `track_time` <= '2012-11-12 23:59:59'
UNION
SELECT user,track_time FROM `tracks`
WHERE `track_time` >= '2012-11-19 00:00:00'
AND `track_time` <= '2012-11-19 23:59:59'
UNION
SELECT user,track_time FROM `tracks`
WHERE `track_time` >= '2012-11-26 00:00:00'
AND `track_time` <= '2012-11-26 23:59:59'
) A;
Run Code Online (Sandbox Code Playgroud)
试一试 !!!
如果您只想计算一个日期的不同用户 2012-11-12
SELECT COUNT(DISTINCT user) usercount FROM `tracks`
WHERE `track_time` >= '2012-11-12 00:00:00'
AND `track_time` <= '2012-11-12 23:59:59';
Run Code Online (Sandbox Code Playgroud)
如果您想对连续 7 个日期的不同用户进行计数2012-11-12- 2012-11-18(您不能包括2012-11-19)
SELECT
DATE(track_time) track_date,
COUNT(DISTINCT user) usercount
FROM
(
SELECT user,track_time FROM `tracks`
WHERE `track_time` >= '2012-11-12 00:00:00'
AND `track_time` < '2012-11-19 00:00:00'
) A GROUP BY DATE(track_time);
Run Code Online (Sandbox Code Playgroud)
如果您希望从 开始动态完成此操作NOW(),请尝试以下操作:
SELECT
DATE(track_time) track_date,
COUNT(DISTINCT user) usercount
FROM
(
SELECT user,track_time FROM `tracks`
WHERE `track_time` >= ( DATE(NOW()) - INTERVAL 7 DAY + INTERVAL 0 SECOND )
) A GROUP BY DATE(track_time);
Run Code Online (Sandbox Code Playgroud)