web-dev-qa-db-fra.com

Comment récupérer des lignes de différentes dates en utilisant la clause

Ma structure de table:

+-----------------+--------------+------+-----+-------------------+----------------+
| 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 |                |
+-----------------+--------------+------+-----+-------------------+----------------+

Je dois récupérer des données de la table pendant sept jours les plus écoulés, non résumée. Données Pour une date précise, pour cela, je dois désigner la même requête sept fois à l'aide de l'opérateur:

SELECT COUNT(DISTINCT `user`) FROM `tracks` WHERE `track_time` LIKE '2012-11-12%';

Ce qui n'est pas un bon moyen de faire. J'essaie de faire moi-même, également discuté sur des forums, cela pourrait être fait avec DANS Opérateur ou en utilisant Date1 <date2 <.... Date des sept dernières années journées. Pour cela, j'utilise une fonction dans PHP dans lequel je fournis un paramètre de date, mais la requête prendra beaucoup de temps pour afficher le résultat sur le Web. Veuillez jeter un coup d'œil sur cette situation.

4
Shashank

Si vous faites une gamme de dates consécutives, il n'est pas nécessaire d'utiliser l'opérateur IN.

Si vous utilisez ceci pour calculer minuit il y a sept jours

DATE(NOW()) - INTERVAL 7 DAY + INTERVAL 0 SECOND

voici ce que vous revenez:

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>

Votre requête ressemblera à ceci:

SELECT COUNT(DISTINCT `user`) FROM `tracks`
WHERE `track_time` >= ( DATE(NOW()) - INTERVAL 7 DAY + INTERVAL 0 SECOND );

Vous avez également besoin d'un index pour prendre en charge le WHERE et COUNT

ALTER TABLE tracks ADD INDEX track_time_user_ndx (track_time,user);

Ensuite, la requête devrait aller plus vite.

Si vous faites une gamme de dates consécutives d'une période antérieure, fournissez simplement la première et dernière date de minuit à minuit. Par exemple, pour la plage 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';

Si vous faites une gamme de dates non consécutives, structurez simplement la requête en utilisant UNION. Par exemple, pour les dates 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;

Essaie !!!

Mise à jour 2012-11-27 13:52

Si vous souhaitez le nombre d'utilisateurs distincts pour une seule date 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';

Si vous souhaitez le nombre d'utilisateurs distincts pour 7 dates consécutives 2012-11-12 - 2012-11-18 (Vous ne pouvez pas inclure 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);

Mise à jour 2012-11-27 14:41 EDT

Si vous le souhaitez de manière dynamique de NOW(), essayez ceci:

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);
6
RolandoMySQLDBA