Построение статистики по времени - помогите добавить пробелы во времени ..

kvn

programmer
Построение статистики по времени - помогите добавить пробелы во времени ..

Привет. С праздниками Вас всех!

Нужен хелп:

есть табличка типа:
id | int(5) unsigned
c_time | timestamp(14)
serial | int(10) unsigned

ТИпа лог-таблица
id | время (до секунды) | запрос

Делаю статистику по времени суток: аля
#
# ##
## ####
###__######_
0 1 2 3 4 5 6 7 8 9...

где числа - это часы суток, а соотв. на графике значения.
делаю:

SELECT
YEAR(c_time) as year,
MONTHNAME(c_time) as month,
DAYOFMONTH(c_time) as day,
HOUR(c_time) as hour,
count(serial) as cnt
FROM stat
WHERE
c_time >= $from_date
AND c_time<=$to_date
GROUP
BY year, month,day,hour
ORDER BY c_time, hour

Т.е. вроде бы все как надо.
Но: если происходит провал в статистике, т.е. если допустим с 2-х до 3-х часов не было запросов, то соотв в результате это время в статистике вообще не фигурирует, т.е. получаеться
0 1 4 5 6 7 8 9 ... и график, вроде провалов как бы и не было..
результат типа этого:
+--------------+-------------------+------+-----+
| YEAR(c_time) | MONTHNAME(c_time) | hour | cnt |
+--------------+-------------------+------+-----+
| 2003 | January | 0 | 121 |
| 2003 | January | 1 | 51 |
| 2003 | January | 2 | 34 |
| 2003 | January | 3 | 9 |
| 2003 | January | 4 | 1 |
| 2003 | January | 6 | 5 |
| 2003 | January | 7 | 24 |
| 2003 | January | 8 | 63 |
| 2003 | January | 9 | 108 |
| 2003 | January | 10 | 165 |
| 2003 | January | 11 | 37 |
+--------------+-------------------+------+-----+
5 часов - выпало.


Вопрос: как решить данную проблему SQL-запросом (и можно ли вообще), или как-то в цикле перебора record-set-а как-то ПХПой добавить эти пробелы. Просто хочется элегантного решения, и НЕ делать
for ($i=0; $i<=23; $i++) {
$sql = "SELECT .. WHERE time>$i AND time<=$i+1";
}

Спасибо.
 

Demiurg

Guest
проверяй при выводе на пропуски и вставляй то, что тебе надо.
 

Crazy

Developer
1. Завести таблицу Годов и заполнить ее всеми возможными у тебя годами. Аналогично -- с месяцами и днями. Пусть это будут таблицы Years, Months и Days.
2. Делаешь left join этих таблиц со своей статистикой, отфильтровывая невозможные даты.

Общая идея понятна? :)
 
Сверху