@dfhusfhgsuo3

Как вывести данные по часам?

Здравствуйте.

Есть запрос типа
"SELECT DATE_FORMAT(time, '%H') H, COUNT(*) N FROM `statistics` WHERE user_id=70 AND time>=CURDATE() GROUP BY DATE_FORMAT(time, '%Y-%m-%d %H') ORDER BY
  date ASC"


Нужно выводить статистику активности по часам.

В таком подходе проблем с пользователем, у кого высокая активность проблем нет (то есть если с полуночи 00 до текущего времени была активность каждый час, то все выведет корректно):

for($i = 0; $i < 24; $i = $i + 1){
    $data = mysql_fetch_assoc($sql);
       echo $chartdata['N'] .', '; 
};


Но если у пользователя активность маленькая (из 24 часов только в нескольких была активность), то появляются проблемы.

Пробовал так исправить:

for($i = 0; $i < 24; $i = $i + 1){
    $data = mysql_fetch_assoc($sql);

        $hourg = $chartdata['H'];
        $d = $chartdata['N'];

        if($hourg==$i) {
            echo $d .', '; 
        } else {
            echo '0, ';
        }
    ;}


Допустим, если у пользователя активность только в один час за весь день (и это было в 18:00) все равно данные выводятся только при первой итерации, далее становятся недоступны для использования. Здесь явно мало for

Буду благодарен за помощь
  • Вопрос задан
  • 163 просмотра
Решения вопроса 1
@dfhusfhgsuo3 Автор вопроса
Получилось сделать следующим образом:

1) Был создан пустой массив "время - данные".
2) Из данных с запроса собираем второй массив "время - данные"
3) Соединяем массивы
4) Используем полученные данные в нужном формате

Возможно кому-то пригодится
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
VladimirAndreev
@VladimirAndreev
php web dev
Select a.dt, ifnull(b._cnt, 0) as _cnt
From (
Select '00' as h
Union all select '01' as h
...
Union all select '23' as h
) a
Left join (select DATE_FORMAT(NOW(), '%H') as h, 100500 as _cnt) b using(h)
Ответ написан
@Vitsliputsli
Как вариант, собрать таблицу часов рекурсивно:
WITH recursive hours (n) AS (
    SELECT (@q:=0) n FROM dual
    UNION ALL
    SELECT (@q:=@q+1) n FROM hours WHERE @q<24
)
SELECT hours.n, ваш_запрос.* FROM ваш_запрос
    RIGHT JOIN hours ON ваш_запрос.час = hours.n

или если часы строки, то:
WITH recursive hours (n) AS (
    SELECT CONCAT("0",CAST(@q:=0 as varchar(1))) n FROM dual
    UNION ALL
    SELECT LPAD(CAST(@q:=@q+1 as varchar(2)),2,"0") n FROM hours WHERE @q<24
)
SELECT hours.n, ваш_запрос.* FROM ваш_запрос
    RIGHT JOIN hours ON  ваш_запрос.час = hours.n
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы