Группировка временных меток в MySQL с помощью PHP

Я хочу регистрировать определенные действия в MySql с временным кодом, используя time(). Теперь я накапливаю тысячи записей, я хочу выводить данные по наборам часов/дней/месяцев и т. д.

Каким будет предложенный метод группировки временных кодов в MySQL?

Пример данных:

  • 1248651289
  • 1248651299
  • 1248651386
  • 1248651588
  • 1248651647
  • 1248651700
  • 1248651707
  • 1248651737
  • 1248651808
  • 1248652269

Пример кода:

$sql = "SELECT COUNT(timecode) FROM timecodeTable";
//GROUP BY round(timecode/3600, 1) //group by hour??

Редактировать: есть две группы, которые можно сгруппировать, поэтому я должен сделать это более ясным: 24 часа в сутках можно сгруппировать, но меня больше интересует группировка по времени, поэтому я возвращаю 365 результатов для каждого года. отслеживание на месте, поэтому общее количество за каждый прошедший день, а затем возможность выбрать диапазон дат и просмотреть более подробную информацию о часах/минутах, доступ к которым был осуществлен за выбранное время.

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


person Peter Craig    schedule 27.07.2009    source источник
comment
Я не могу понять ни ваше последнее редактирование, ни ваш комментарий ниже. Приведите пример ожидаемого результата. Я бы предпочел, чтобы вы дали образец набора результатов, а не используемые слова.   -  person hobodave    schedule 27.07.2009


Ответы (1)


Питер

SELECT COUNT(*), HOUR(timecode)
FROM timecodeTable
GROUP BY HOUR(timecode);

Ваш результирующий набор, учитывая приведенные выше данные, будет выглядеть так:

+----------+----------------+
| COUNT(*) | HOUR(timecode) |
+----------+----------------+
|       10 |             18 | 
+----------+----------------+

Многие другие связанные функции можно найти здесь< /а>.

Изменить

Проведя несколько собственных тестов на основе вашего комментария, я определил, что ваша база данных находится в состоянии эпического сбоя. :) Вы используете INT как TIMESTAMP. Это никогда не бывает хорошей идеей. Нет оправданной причины использовать INT вместо TIMESTAMP/DATETIME.

Тем не менее, вам придется изменить мой приведенный выше пример следующим образом:

SELECT COUNT(*), HOUR(FROM_UNIXTIME(timecode))
FROM timecodeTable
GROUP BY HOUR(FROM_UNIXTIME(timecode));

Изменить 2

Для этого вы можете использовать дополнительные предложения GROUP BY:

SELECT 
  COUNT(*),
  YEAR(timecode),
  DAYOFYEAR(timecode),
  HOUR(timecode)
FROM timecodeTable
GROUP BY YEAR(timecode), DAYOFYEAR(timecode), HOUR(timecode);

Обратите внимание: для краткости я опустил FROM_UNIXTIME().

person hobodave    schedule 27.07.2009
comment
На этой странице есть много потенциально полезных функций времени, их можно было бы объединить для вывода того, что мне нужно, например, глядя на параметры INTERVAL... Используя мой полный набор данных (более 150 000 записей, охватывающих почти два года времени). коды) это дает мне 105,000: NULL и 58000: 838, что пока мало что для меня значит :) - person Peter Craig; 27.07.2009
comment
Смотрите мой комментарий выше. Вы неадекватно описали то, что вам нужно. - person hobodave; 27.07.2009
comment
Извините, вы правы - мое объяснение сбивает с толку, так как я не совсем понимаю, что я пытаюсь сделать :) Мой опубликованный ответ дает именно то, что мне нужно. - person Peter Craig; 27.07.2009
comment
Вы правы, тайм-коды хранятся как int (шлепнуть по запястью tut tut). Этот пример отлично работает для разбиения на 24 строки (с указанием каждого часа). Есть ли вариант, который может выводить 17500+ строк каждого часа на временной шкале (т.е. 24 часа * 365 дней * 2 года = 17500 записей)? - person Peter Craig; 27.07.2009
comment
Мои временные коды хранятся как int, потому что мне проще работать с такими числами, как 1248659428 (родной для PHP) вместо 2009-07-27 11:25:01. - person Peter Craig; 27.07.2009
comment
Спасибо за продолжение редактирования, это именно то, что я ищу с временным FROM_UNIXTIME(). Я конвертирую записи. Работает отлично, ура! - person Peter Craig; 27.07.2009