Vous pouvez le faire en utilisant group by avec le niveau que vous voulez. Voici un exemple utilisant les données que vous avez fournies :
D'abord le SQL pour créer la table et la remplir. La colonne ID ici n'est pas "nécessaire", mais elle est recommandée si la table est volumineuse ou contient des index.
CREATE TABLE `test`.`events` (
`id` INT NOT NULL AUTO_INCREMENT,
`user` INT NULL,
`start` DATETIME NULL,
`end` DATETIME NULL,
`type` VARCHAR(45) NULL,
PRIMARY KEY (`id`));
INSERT INTO events (user, start, end, type) VALUES
(1, '2015-1-1 12:00:00', '2015-1-1 12:03:59', 'browsing'),
(2, '2015-1-1 12:03:00', '2015-1-1 12:06:00', 'browsing'),
(2, '2015-1-1 12:03:00', '2015-1-1 12:06:00', 'eating'),
(3, '2015-1-1 12:03:00', '2015-1-1 12:08:00', 'browsing');
Pour obtenir une liste de paires ordonnées du nombre de minutes de durée au nombre d'événements :
La requête peut ensuite être facilement écrite à l'aide de la fonction timestampdiff, comme indiqué ci-dessous :
SELECT
TIMESTAMPDIFF(MINUTE, start, end) as minutes,
COUNT(*) AS numEvents
FROM
test.events
GROUP BY TIMESTAMPDIFF(MINUTE, start, end)
La sortie :
minutes numEvents
3 3
5 1
Le premier paramètre de la sélection peut être FRAC_SECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER ou YEAR.
Voici d'autres exemples de requêtes que vous pouvez effectuer :
Événements par heure (la fonction d'étage est appliquée)
SELECT
TIMESTAMPDIFF(HOUR, start, end) as hours,
COUNT(*) AS numEvents
FROM
test.events
GROUP BY TIMESTAMPDIFF(HOUR, start, end)
**Événements par heure avec un meilleur formatage **
SELECT
CONCAT("<", TIMESTAMPDIFF(HOUR, start, end) + 1) as hours,
COUNT(*) AS numEvents
FROM
test.events
GROUP BY TIMESTAMPDIFF(HOUR, start, end)
Vous pouvez grouper par une variété d'options, mais cela devrait certainement vous aider à démarrer. La plupart des packages de traçage vous permettront de spécifier des coordonnées x y arbitraires, vous n'avez donc pas à vous soucier des valeurs manquantes sur l'axe x.
Pour obtenir une liste de paires ordonnées de nombre d'événements à un moment précis (pour la journalisation) : Notez que cela est laissé pour référence.
Maintenant pour les requêtes. Vous devez d'abord choisir l'élément que vous souhaitez utiliser pour le regroupement. Par exemple, une tâche peut prendre plus d'une minute, de sorte que le début et la fin se situent dans des minutes différentes. Pour tous ces exemples, je les base sur l'heure de début, car c'est à ce moment-là que l'événement a réellement eu lieu.
Pour regrouper le nombre d'événements par minute, vous pouvez utiliser une requête comme celle-ci :
SELECT
DATE_FORMAT(start, '%M %e, %Y %h:%i %p') as minute,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start), MONTH(start), DAYOFMONTH(start), HOUR(start), MINUTE(start);
Notez comment cela regroupe tous les éléments, en commençant par l'année, en allant à la minute. J'ai aussi la minute affichée sous forme d'étiquette. La sortie résultante ressemble à ceci :
minute numEvents
January 1, 2015 12:00 PM 1
January 1, 2015 12:03 PM 3
Ce sont des données que vous pouvez ensuite prendre en utilisant php et les préparer pour être affichées par l'une des nombreuses bibliothèques graphiques disponibles, en traçant la colonne des minutes sur l'axe des x et en traçant les numEvents sur l'axe des y.
Voici d'autres exemples de requêtes que vous pouvez effectuer :
Événements par heure
SELECT
DATE_FORMAT(start, '%M %e, %Y %h %p') as hour,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start), MONTH(start), DAYOFMONTH(start), HOUR(start);
Événements par date
SELECT
DATE_FORMAT(start, '%M %e, %Y') as date,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start), MONTH(start), DAYOFMONTH(start);
Événements par mois
SELECT
DATE_FORMAT(start, '%M %Y') as date,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start), MONTH(start);
Événements par année
SELECT
DATE_FORMAT(start, '%Y') as date,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start);
Je dois également souligner que si vous avez un index sur la colonne de départ de cette table, ces requêtes se termineront rapidement, même avec des centaines de millions de lignes.
J'espère que cela t'aides! Faites-moi savoir si vous avez d'autres questions à ce sujet.