Получение статистики дневных значений, упорядоченных в нечетких диапазонах - PullRequest
0 голосов
/ 17 ноября 2011

ОК, следующая задача; У меня есть таблица, которая имеет 3 столбца, ID, UserID и Time, который является типом DateTime. Теперь я хочу получить следующую статистику:

У меня есть 5 диапазонов:

  • Утро (6 утра - 11:30 утра)
  • Полдень (11:30 - 2:00)
  • Полдень (14:00 - 18:00)
  • Вечер (с 18:00 до 22:00)
  • Ночь (10 вечера - 6 утра)

Пользователь имеет, например, следующие записи:

ID  UserID  Time
46  1       2011-11-17 17:51:24
47  1       2011-11-17 11:41:41
48  1       2011-11-17 07:31:20
49  1       2011-11-17 21:41:55
50  1       2011-11-17 21:58:28
99  1       2011-11-18 10:12:18

Моя цель - получить следующий массив:

Array (
 ['today']  => Array (
  ['morning'] => 1,
  ['noon'] => 1,
  ['afternoon'] => 1,
  ['evening'] => 2,
  ['night'] => 0
 )
 ['all']  => Array (
  ['morning'] => 2,
  ['noon'] => 1,
  ['afternoon'] => 1,
  ['evening'] => 2,
  ['night'] => 0
 )
 ['avg']  => Array (
  ['morning'] => 1.5,
  ['noon'] => 0.5,
  ['afternoon'] => 0.5,
  ['evening'] => 1,
  ['night'] => 0
 )
)

Ну, это работает, если я действительно перебираю набор результатов всех значений пользователя, но держу пари, что через MySQL и его функции даты есть более простой способ. Также у меня возникают проблемы, если я пытаюсь взять все записи и просто хочу узнать время, а не дату. Мне нужно сначала разобрать его с помощью функций php date и получить само время, и это действительно бесполезно, потому что я, вероятно, получу несколько сотен тысяч этих строк на идентификатор пользователя. Сама дата должна храниться в таблице для других задач.

Ответы [ 2 ]

2 голосов
/ 17 ноября 2011

Я бы предложил поместить эти диапазоны дат в таблицу, в поля времени

timenames:
id   name      start     end
1    Morning   00:06:00  11:29:59
2    Noon      11:30:00  13:59:59
etc...

Тогда вы можете сделать

SELECT timenames.name, timenames.start, timenames.end, COUNT(users.id)
FROM timenames
LEFT JOIN users ON (TIME(users.`Time`) BETWEEN timenames.start AND timenames.end)
GROUP BY timenames.id

, который ДОЛЖЕН дать вам подсчет всех событий в пределахдиапазон времени каждого временного имени.

0 голосов
/ 17 ноября 2011

MySQL имеет конструкцию CASE , которая аналогична конструкции в PHP. Вы можете использовать это для присвоения каждой строке идентификатора на основе значения времени, а затем использовать обычные функции GROUP и т. Д., Чтобы возвращать данные так, как вы этого хотите.

Если в системе действительно высокое отношение SELECT к INSERT / UPDATE, то вы можете рассмотреть возможность денормализации данных для повышения производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...