MySQL, как заполнить недостающие часы / даты в диапазоне? - PullRequest
1 голос
/ 04 января 2012

Я пытаюсь извлечь данные в соответствии с Днем недели, а также Часом дня в одном и том же утверждении (чтобы я мог видеть, сколько посещений я получил за час и за неделю. Вот утверждение.

SELECT
count(id) as count,
HOUR(created) as hour_of_day,
WEEKDAY(created) as day_of_week,
DATE_FORMAT(created,'%W') name_of_day
FROM visitors
GROUP BY day_of_week,hour_of_day
ORDER BY day_of_week,hour_of_day ASC

Некоторые образцы данных

    count   hour_of_day day_of_week name_of_day
    2       0           0           Monday
    1       1           0           Monday
    1       4           0           Monday
    4       5           0           Monday
    1       6           0           Monday
    4       7           0           Monday
    1       9           0           Monday
    1       10          0           Monday
    1       12          0           Monday
    1       13          0           Monday
    2       16          0           Monday
    5       18          0           Monday
    5       19          0           Monday

Проблема Как вы можете видеть, данные отсутствуют в течение многих часов. И так как я создаю график, которому нужны данные в виде [x, x, x, x, x, x, x] для каждого дня, который будет сопоставлен с 24-часовой шкалой времени, начиная с первого вывода, мне нужно недостающие должны быть '0'.

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

Возможно ли это без временных таблиц (например, включая 24 цифры в самом запросе и т. Д.)?

Ответы [ 2 ]

2 голосов
/ 04 января 2012

Не самая красивая.Но это должно сработать, если вы действительно не можете использовать временные таблицы:Если вы выполняете запрос в течение нескольких недель, то несколько дней недели будут добавлены вместе.Возможно, вы захотите добавить предикат «только на этой неделе».Например, добавьте where yearweek(created) = yearweek(now()) в исходный выбор, чтобы получить данные только за текущую неделю.

1 голос
/ 04 января 2012

Не знаю, почему вы не хотите использовать временные таблицы, это значительно упрощает жизнь.

решение лучше всего изложить здесь: http://www.freeopenbook.com/mysqlcookbook/mysqlckbk-chp-12-sect-10.html

По сути вам придетсясоздайте таблицу со всеми часами дня и оставьте на ней соединение.

...