Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Группировка данных по часам и суткам
 
 автор: Евгений Петров   (09.10.2005 в 16:02)   письмо автору
 
 

И снова у меня вопрос по SQL. :)
Есть счетчик. Когда пользователь заходит на страницу со счетчиком, то время захода заносится в таблицу counter.
counter
+---------------------+
|        time         |
+---------------------+
| 2005-08-30 00:23:08 |
| 2005-08-30 00:23:32 | 
| 2005-08-30 00:24:03 |
| 2005-08-30 13:24:20 |
| 2005-08-30 13:25:55 |
| 2005-08-30 13:26:45 |
| 2005-08-30 13:32:01 |
| 2005-08-30 18:33:19 |
| 2005-08-30 18:35:19 |
| 2005-08-30 20:35:46 |
| 2005-08-30 21:35:49 |
| 2005-08-30 21:38:33 |
| 2005-09-30 00:39:27 |
| 2005-09-30 01:40:15 |
| 2005-09-30 01:41:04 |
| 2005-09-30 13:41:33 |
| 2005-09-30 13:41:37 |
| 2005-09-30 15:41:51 |
| 2005-09-30 15:44:10 |
| 2005-09-30 18:44:21 |
| 2005-09-30 18:44:33 |
| 2005-09-30 18:44:56 |
| 2005-09-30 18:44:56 |
| 2005-09-30 21:44:56 |
+---------------------+

Так вот у меня такая проблемка. Мне нужно сделать таблицу в которой по часам будет расписана средняя посещаемость со всех дней. Т.е.:
+--------+-------+
| HOUR() | AVG() |
+--------+-------+
|   00   |   2   |
|   01   |   1   |
|   13   |   3   |
|   15   |   1   |
|   18   |   3   |
|   20   |  0.5  |
|   21   |  1.5  |
+--------+-------+

Заранее ОГРОМНЕЙШЕЕ спасибо!

   
 
 автор: napTu3aH   (09.10.2005 в 16:18)   письмо автору
 
   для: Евгений Петров   (09.10.2005 в 16:02)
 

Попробуйте этот запрос

SELECT DATE_FORMAT(time,'%H') AS num_hour,
COUNT(DATE_FORMAT(time,'%H')) AS avg
FROM 'counter' 
GROUP BY DATE_FORMAT(time,'%H')

   
 
 автор: Евгений Петров   (09.10.2005 в 16:27)   письмо автору
 
   для: napTu3aH   (09.10.2005 в 16:18)
 

Не совсем уверен где именно ошибка, но это не то. т.к. при очередном заходе на сайт среднее значение увеличивается на единицу. А должно где то на 0.01 т.к. статистика ведется уже не один день.

   
 
 автор: napTu3aH   (09.10.2005 в 16:33)   письмо автору
 
   для: Евгений Петров   (09.10.2005 в 16:27)
 

Да действительно, я не внимательно прочитал ваш пост. Этот запрос выводит не среднее значение, а количество поситителей за конкретный час.

   
 
 автор: napTu3aH   (09.10.2005 в 16:49)   письмо автору
 
   для: Евгений Петров   (09.10.2005 в 16:27)
 

У вас в таблице присутствует первичный идентификатор? Например "id"

   
 
 автор: Евгений Петров   (09.10.2005 в 19:23)   письмо автору
 
   для: napTu3aH   (09.10.2005 в 16:49)
 

Нет но если надо сделаю. :)

   
 
 автор: Евгений Петров   (09.10.2005 в 19:23)   письмо автору
 
   для: napTu3aH   (09.10.2005 в 16:49)
 

Нет но если надо сделаю. :)

   
 
 автор: Евгений Петров   (09.10.2005 в 19:48)   письмо автору
 
   для: Евгений Петров   (09.10.2005 в 19:23)
 

Если надо вот дамп таблицы:

   
 
 автор: napTu3aH   (09.10.2005 в 20:18)   письмо автору
 
   для: Евгений Петров   (09.10.2005 в 19:48)
 

Спасибо, я воссоздал у себя похожую, можно будет и на вашей попробовать. Искал функцию Мускула возвращающую общее количество строк в таблице, но так и не нашел. Можно обойти, если создать поле id auto_increment, и если записи иэ таблицы не будут удаляться.

SELECT DATE_FORMAT(time,'%H') AS num_hour, 
COUNT(DATE_FORMAT(time,'%H'))/MAX(id) AS avg 
FROM 'counter' 
GROUP BY DATE_FORMAT(time,'%H')

Или писать в два запроса, в первом принимать количество строк, а во втором просто подставить это значение для общего числа строк.

$sql="SELECT * FROM counter";
$num=mysql_num_rows($sql);
$sql="SELECT DATE_FORMAT(time,'%H') AS num_hour, 
COUNT(DATE_FORMAT(time,'%H'))/$num
FROM 'counter' 
GROUP BY DATE_FORMAT(time,'%H')";
$result=mysql_query($sql);

   
 
 автор: Евгений Петров   (10.10.2005 в 01:02)   письмо автору
 
   для: napTu3aH   (09.10.2005 в 20:18)
 

Спасибо буду смотреть.

   
 
 автор: Евгений Петров   (10.10.2005 в 16:07)   письмо автору
 
   для: Евгений Петров   (10.10.2005 в 01:02)
 

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

   
 
 автор: Евгений Петров   (10.10.2005 в 16:09)   письмо автору
 
   для: Евгений Петров   (10.10.2005 в 16:07)
 

Сам сказал и сам ответил. :) Третью строчку в вашем коде надо заменить на:
$sql=mysql_query("SELECT * FROM counter GROUP BY DATE_FORMAT(time,'%d')");

И все работает. Спасибо!

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования