Подсчет ежедневных и часовых результатов в mySQL

У меня есть две таблицы в MySQL, одна для представлений и одна для загрузок со следующей структурой ключа:

ip          | hit
---------------------------------------
127.0.0.1   | 2015-02-08 15:16:59
127.0.0.1   | 2015-02-08 15:20:22
127.0.0.1   | 2015-02-08 15:20:35
127.0.0.1   | 2015-02-08 15:21:13
10.0.1.1    | 2015-02-09 16:29:13
10.0.1.1    | 2015-02-09 16:42:12
10.0.1.1    | 2015-02-09 16:52:30
10.0.1.1    | 2015-02-10 10:52:30
10.0.1.1    | 2015-02-10 10:52:30
10.0.1.1    | 2015-02-10 12:52:30

Мне нужно вернуть запрос, который будет подсчитывать количество строк в день, в идеале он также будет возвращать пустые дни / часы, но я могу легко заполнить эти пробелы с помощью PHP, если запрос SQL будет слишком сложным.

time        | count
---------------------------------------
2015-02-08  | 4
2015-02-09  | 3
2015-02-10  | 3

Мне также нужно получать ту же информацию на почасовой основе

time                          | count
---------------------------------------
2015-02-08 15:00:00           | 4
2015-02-09 16:00:00           | 3
2015-02-10 10:00:00           | 2
2015-02-10 10:00:00           | 1

До сих пор у меня был следующий запрос после объединения нескольких я нашел в Интернете что-то, что на самом деле работает, но он возвращает только день месяца как уникальный, и мне нужно, чтобы запрос был растягивался на несколько месяцев, так что только зная день не очень полезно.

select dayofmonth(hit) as Day_of_month, count(*) as records from table_name hit >= '2015-02-01 00:00:00' and hit <  '2015-03-01 00:00:00' group by dayofmonth(hit)

Я видел довольно много подобных постов вокруг, но единственные, которые я нашел, используют функции, которых нет в mySQL, кажется, любая помощь будет оценена.

редактировать

После гораздо большего беспокойства у меня теперь есть возвращающие счетчики для каждой даты со следующим, который я могу легко ограничить по родам, однако я все еще не могу заставить это работать на почасовой основе.

SELECT date(hit) AS The_Date, count( * ) AS count FROM table_name GROUP BY The_Date ORDER BY The_Date ASC

0

Решение

Самый простой способ сделать это — использовать Формат даты функция

  • Чтобы получить все записи, сгруппированные по дням

    select date_format(date, '%Y-%m-%d') time, count(*) from test group by time order by time;
    
  • Чтобы получить все записи, сгруппированные по часам

    select date_format(date, '%Y-%m-%d %H:00:00') time, count(*) from test group by date_format(date, '%Y-%m-%d %H') order by time;
    

Вот это sqlfiddle для вашего примера

4

Другие решения

Попробуйте что-то вроде этого:

SELECT DATE(hit) AS Day, HOUR(TIME(hit)) AS Hour, COUNT(*) as Count
FROM table_name
GROUP BY Day, Hour

(Изм)

2

По вопросам рекламы [email protected]