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.
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 !!!
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);
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);