如何使用 IN 子句检索不同日期的行

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 上显示结果。请看一下这种情况。

Rol*_*DBA 6

如果您正在执行一系列连续日期,则无需使用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)

您还需要一个索引来支持WHERECOUNT

ALTER TABLE tracks ADD INDEX track_time_user_ndx (track_time,user);
Run Code Online (Sandbox Code Playgroud)

然后,查询应该更快。

如果您正在处理某个较早时期的一系列连续日期,只需提供从午夜到午夜的第一个和最后一个日期。例如,对于范围2012-11-122012-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-27 13:52

如果您只想计算一个日期的不同用户 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)

更新 2012-11-27 14:41 EDT

如果您希望从 开始动态完成此操作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)