Можете да направите това, като използвате група по с нивото, което искате. Ето пример, използващ данните, които сте предоставили:
Първо SQL, за да създадете таблицата и да я попълните. Идентификационната колона тук не е „необходима“, но се препоръчва, ако таблицата ще е голяма или ще има индекси в нея.
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');
За да получите списък с подредени двойки от продължителност на минути към брой събития:
След това заявката може лесно да бъде написана с помощта на функцията timestampdiff, както е показано по-долу:
SELECT
TIMESTAMPDIFF(MINUTE, start, end) as minutes,
COUNT(*) AS numEvents
FROM
test.events
GROUP BY TIMESTAMPDIFF(MINUTE, start, end)
Резултатът:
minutes numEvents
3 3
5 1
Първият параметър в избора може да бъде един от FRAC_SECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER или YEAR.
Ето още няколко примера за заявки, които можете да направите:
Събития по час (прилага се функцията на етажа)
SELECT
TIMESTAMPDIFF(HOUR, start, end) as hours,
COUNT(*) AS numEvents
FROM
test.events
GROUP BY TIMESTAMPDIFF(HOUR, start, end)
**Събития по час с по-добро форматиране **
SELECT
CONCAT("<", TIMESTAMPDIFF(HOUR, start, end) + 1) as hours,
COUNT(*) AS numEvents
FROM
test.events
GROUP BY TIMESTAMPDIFF(HOUR, start, end)
Можете да групирате по различни опции, но това определено трябва да ви помогне да започнете. Повечето пакети за начертаване ще ви позволят да зададете произволни координати x y, така че не е нужно да се притеснявате за липсващите стойности по оста x.
За да получите списък с подредени двойки от брой събития в определено време (за регистриране): Имайте предвид, че това е оставено за справка.
Сега за запитванията. Първо трябва да изберете кой артикул искате да използвате за групирането. Например една задача може да отнеме повече от минута, така че началото и краят ще бъдат в различни минути. За всички тези примери ги базирам на началния час, тъй като това е моментът, когато събитието всъщност се е състояло.
За да групирате броя на събитията по минута, можете да използвате заявка като тази:
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);
Обърнете внимание как това се групира по всички елементи, като се започне от годината, продължавайки до минутата. Имам също така показаната минута като етикет. Полученият резултат изглежда така:
minute numEvents
January 1, 2015 12:00 PM 1
January 1, 2015 12:03 PM 3
Това са данни, които след това можете да вземете с помощта на php и да ги подготвите за показване от една от многото графични библиотеки там, като начертаете колоната за минути по оста x и начертаете numEvents по оста y.
Ето още няколко примера за заявки, които можете да направите:
Събития по час
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);
Събития по дата
SELECT
DATE_FORMAT(start, '%M %e, %Y') as date,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start), MONTH(start), DAYOFMONTH(start);
Събития по месеци
SELECT
DATE_FORMAT(start, '%M %Y') as date,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start), MONTH(start);
Събития по година
SELECT
DATE_FORMAT(start, '%Y') as date,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start);
Трябва също да отбележа, че ако имате индекс в началната колона за тази таблица, тези заявки ще завършат бързо, дори със стотици милиони редове.
Надявам се това да помогне! Кажете ми, ако имате други въпроси относно това.