PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (1): [1]

> Найдено сообщений: 14
wmaster Отправлено: 08 Декабря, 2011 - 17:53:19 • Тема: расчет времени проведенного онлайн • Форум: SQL и Архитектура БД

Ответов: 22
Просмотров: 127
Да на сайте у них даже доки по API есть, но они на английском, у меня с ним проблемы. Очень много различных параметров. Примеры есть, но в них не до конца понятно, как можно изменить график на свой лад. Тема для меня совсем новая. Что java, JQuery.
wmaster Отправлено: 08 Декабря, 2011 - 17:03:52 • Тема: расчет времени проведенного онлайн • Форум: SQL и Архитектура БД

Ответов: 22
Просмотров: 127
Про ORDER BY спасибо, уберу. Это я его при тестировании прилепил, смотрел на результаты выдачи. И про for, тоже буду иметь ввиду.

Теперь появился геморрой с Highstock, но это уже другая тема Улыбка
wmaster Отправлено: 08 Декабря, 2011 - 14:12:52 • Тема: расчет времени проведенного онлайн • Форум: SQL и Архитектура БД

Ответов: 22
Просмотров: 127
Спасибо! А то я пол ночи просидел с array_key_exists, вроде бы нащупал решение, но не до конца.

Получился такой код:
PHP:
скопировать код в буфер обмена
  1.         if($result = $mysqli->query($q2))
  2.                 {
  3.                         $data = array();
  4.                         $i = 0;
  5.                         while($row = $result->fetch_assoc()){
  6.                                  $arrUsers[$row['hours']] = $row['duration'];
  7.                         $i++;
  8.                         }
  9.  
  10.                         $arrTime=array('00','01','02','03','04','05','06','07','08','09',10,11,12,13,14,15,16,17,18,19,20,21,22,23);
  11.                         /*В этот массив записываем все интервалы*/
  12.                         /*$arrTime=array('00:00','01:00'); может быть так*/
  13.                         for($i=0; $i < count($arrTime); $i++){
  14.  
  15.                                 if (array_key_exists($arrTime[$i], $arrUsers)){
  16.  
  17.                                         $arrRes[$i] = $arrUsers[$arrTime[$i]];
  18.                         } else {
  19.  
  20.                                         $arrRes[$i] = 0;
  21.                         }
  22.                         }
  23.  
  24.                 }

На выходе получаем человеческий массив, от 0 до 23 со значениями `duration` в минутах.
wmaster Отправлено: 08 Декабря, 2011 - 00:51:51 • Тема: расчет времени проведенного онлайн • Форум: SQL и Архитектура БД

Ответов: 22
Просмотров: 127
Практически все переделал. Но появилась (надеюсь временно) проблема с выборкой данных для отображения на графике.

В базе теперь всего две таблицы:

Спойлер (Отобразить)

Спойлер (Отобразить)


Если пользователь в сети, то делаем так:

CODE (SQL):
скопировать код в буфер обмена
  1. INSERT INTO `users_temp` (date, user) VALUES (FROM_UNIXTIME($v), $uid);


Если пользователь оффлайн, то ничего не пишем. Раз в сутки (допустим, можно и раз в час), делаем перенос данных (цикл на PHP) из временной таблицы в итоговую:

CODE (SQL):
скопировать код в буфер обмена
  1. INSERT INTO `users` (user, date, duration) SELECT `user`, DATE_FORMAT(`date`,'%Y-%m-%d %H') AS hours, COUNT(*) * 5 AS duration FROM `users_temp` WHERE `date` BETWEEN '$start' AND '$end' AND `user` = '$uid' GROUP BY `hours`;
  2.  
  3. DELETE LOW_PRIORITY FROM `users_temp` WHERE `date` BETWEEN '$start' AND '$end' AND `user` = '$uid';


Тут вроде как разобрался и все работает. Но, теперь мне надо из таблицы `users` выбрать значения, чтобы положить их на график, что-то типа:

hour, duration
00, 5
01, 0
02, 0
..
22,35
23,40

Вроде бы такой запрос и никаких проблем:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT DATE_FORMAT(date,'%H') AS hours, duration FROM `users` WHERE `date` BETWEEN '$start' AND '$end' AND `user` = '$uid' ORDER BY `hours`


Но у меня на выходе массив только с онлайнами, не могу сообразить как добавить или правильно обработать недостающие офланы. Шкала на графике от 00 до 23 часов, а выборку делаю, допустим всего 10 значений и в первой строке может быть значение на 14:00, а мне надо чтобы до 14:00 были Нулевые значения на графике. В общем, я тут запутался Недовольство, огорчение


Хотелось бы такой график видеть (красные строки, это те, которые я не могу "добавить" правильно.)
wmaster Отправлено: 07 Декабря, 2011 - 00:21:50 • Тема: расчет времени проведенного онлайн • Форум: SQL и Архитектура БД

Ответов: 22
Просмотров: 127
tuareg пишет:

Тогда индексы вообще не нужны.
P.S Меня мучает такой вопрос уже 2 дня мучает Улыбка А как Вы график строить будете???
Ось ox-->время, а oy-->???


примерно так


За наводку спасибо, попробую, но не сегодня )
wmaster Отправлено: 06 Декабря, 2011 - 23:45:47 • Тема: расчет времени проведенного онлайн • Форум: SQL и Архитектура БД

Ответов: 22
Просмотров: 127
tuareg пишет:
Здравствуйте.
Я так вот на вскидку. Сделал бы так
1.Первая таблица с полями `time`(время HH:MM),`user`,`status` ENUM('yes','no')==>допустим STAT_DAY
2.Создать вторую таблицу и в ней уже хранить результирующие данные из первой таблицы
==>допустим STAT_Poln
Тогда логика следующая:
В 00:00 каждого дня по крону запускать скрипт или процедуру, которая будет собирать данные из первой таблицы(STAT_DAY) и заносить ее во вторую(STAT_Poln) и очищать первую.

Плюсы данного подхода простой запрос для внесения в первую таблицу, кстати можно посмотреть и сделать ее тип MEMORY.(Работают быстро, если превысят объем то будет как MyISAM (это так на вскидку))


P.S можно записывать только активных юзеров.
Пример время 12:00 активны юзеры 1,2,3 их записываем в Бд. Время 12:10 активны 1,3, а юзер 2 вышел тогда записываем 1,3
При таком подходе из таблицы STAT_DAY можно убрать поле status
На счет запросов сейчас еще подумаю Улыбка

добавление
Если делать запрос через равный интервал(5 мин), то количество времени OnLine посчитаем простым COUNT(*), который умножим на 5 минут и получим время юзера OnLine


Башка уже не варит) Какая структура тогда будет у результирующей таблицы?
user, time, duration

а во временную я пишу что-то типа

time user
0:00 111
1:00 111,222
2:00 111,222
3:00 111,222,333
4:00 111
5:00 111
6:00 вообще пропустить
7:00 222
8:00 222
9:00 111,222

так?

как тогда правильно выбрать нужных мне пользователей, чтобы в результирующую писать?
wmaster Отправлено: 06 Декабря, 2011 - 21:50:02 • Тема: расчет времени проведенного онлайн • Форум: SQL и Архитектура БД

Ответов: 22
Просмотров: 127
Возможно вы правы, только у меня пользователей не больше 100 и потом, более эффективного решения я пока не вижу.
wmaster Отправлено: 06 Декабря, 2011 - 16:25:09 • Тема: расчет времени проведенного онлайн • Форум: SQL и Архитектура БД

Ответов: 22
Просмотров: 127
Я кажется нашел то, что хотел. Одним запросом я делаю выборку по временной таблице u$UID_temp, и посчитанные значения уже пишу в u$UID

CODE (SQL):
скопировать код в буфер обмена
  1. INSERT INTO $tbl (date, duration) SELECT DATE_FORMAT(date,'%Y-%m-%d %H') AS hours, SUM(STATUS) * 5 AS duration FROM $tbl_temp WHERE date BETWEEN '$start' AND '$end' GROUP BY `hours`
wmaster Отправлено: 06 Декабря, 2011 - 12:24:50 • Тема: расчет времени проведенного онлайн • Форум: SQL и Архитектура БД

Ответов: 22
Просмотров: 127
tuareg пишет:
Может я тогда, что-то недопонимаю. Улыбка Итак:
время 12:00 у нас 5 активных user(их id==>1,2,3,4,5)
Если нам надо по сайту сколько user---> INSERT INTO .... (время, 5) Не надо ставить 1.
Т.е всего одна запись, в которой уже все сосчитано, но тут мы не сможем вывести статистику на конкретного user
По конкретному user я предлагал INSERT ... VALUES ('12:00',1),('12:00',2),('12:00',3),('12:00',4),('12:00',5)
Поле таблицы на день зачем timestamp? Есть формат time(чч.мм.сс) более оптимально ИМХО, а в дату уже потом конвертировать при сохранении в основную таблицу.

P.S Просто я не могу понять как Вы определяете что именно я был на Вашем сайте в 12:00, а не Пупкин?
Либо у Вас еще какая-то таблица используется???
Т.е в 12:00 стоит 1 и как Вы определяет кто этот 1???


я наверное вас запутал еще в первых постах Улыбка

Суть в том, что таблицы u111 и u111_temp - таблицы пользователя 111, для 222 будет соответственно u222 и u222_temp

Скрипт опрашивает онлайн статусы моих друзей Вконтакте, через API. Да не суть, даже простых посетителей форума можно "считать" так же, по нику, например.
wmaster Отправлено: 06 Декабря, 2011 - 01:47:12 • Тема: расчет времени проведенного онлайн • Форум: SQL и Архитектура БД

Ответов: 22
Просмотров: 127
tuareg пишет:
Я рад что пошли моим путем Улыбка .
Напишите запрос как Вы сохраняете user в u111_temp? Я пока не понимаю, что за поле STATUS???
Просто в первом посте Вы указали, что надо каждого user-а, а сейчас я понимаю уже сумму всех user-ов на сайте?
Если да, то тогда вообще все еще проще можно сделать и будет у вас всего кол-во записей в таблице равное количеству интервалов.


1. Как я и писал, нужно для каждого отдельно вести статистику. (кол-во минут в день и соответственно кол-во часов в сутки, ну и тд.) Со времени первого поста я немного переделал структуру таблицы и логику скрипта, который опрашивает пользователей.

2. поле Status хранит единичку, если пользователь онлайн, если офф - то в базу ничего не пишет.

Запрос в таблицу u111_temp, допустим, пользователь на момент проверки онлайн:

CODE (SQL):
скопировать код в буфер обмена
  1. INSERT INTO `u111_temp` (date,STATUS) VALUES ($date, 1);


В общем-то я могу все действия делать тремя запросами, просто интересно, можно ли объединить запросы так как я спрашивал выше.

P.S. Теперь ищу удобное средство, чтобы графики рисовать Улыбка
wmaster Отправлено: 05 Декабря, 2011 - 19:55:53 • Тема: Highcharts несколько графиков [php, html5, java] • Форум: HTML, Дизайн & CSS

Ответов: 0
Просмотров: 1653
Здравствуйте. Решил использовать для своих небольших нужд графики Highcharts, с их "рисованием" более менее разобрался, хотя до сих пор не всё понял. Но не могу разместить несколько графиков на одной странице, как это можно реализовать?

Графики НЕ однотипные, где-то диаграмма простая, где-то круговая. Естественно и данные на них разные.

Реализую это дело на PHP.
wmaster Отправлено: 05 Декабря, 2011 - 19:46:44 • Тема: расчет времени проведенного онлайн • Форум: SQL и Архитектура БД

Ответов: 22
Просмотров: 127
tuareg, пошел вашим путем. Сделал так.

таблица
u111: date (timestamp), duration (tinyint) // дата и время проведенное в онлайн в минутах, уже посчитаное.

u111_temp: date (timestamp), status (tinyint) // дата и статус онлай, пишем если пользователь в сети.


1. Скриптом, каждый 5 минут собираем статусы по u111 пользователям, пишем в u111_temp (12*24 = 288 записей в сутки на пользователя).
2. SQL запросом выбираем из таблицы u111_temp данные по активности, суммируем количество "онлайнов" и группируем по часам, иногда проще показать сам запрос, чем описывать как он работает:

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT DATE_FORMAT(date,'%d %b %Hh') AS hours, SUM(STATUS) * 5 AS duration FROM u111_temp GROUP BY `hours`

3. В таблицу u111 переносим почасовую активность (то, что получили в прошлом запросе).
4. Очищаем таблицу u111_temp (можно раз в сутки, можно еще как-то, пока не придумал, как лучше)


Думаю, что такой способ разгрузит БД по нескольким причинам:
1. Экономия записей на каждом пользователе (24 в сутки)
2. Запись только "онлайна" во "временную" таблицу снижает количество обращений (если бы я писал еще и оффлайны)
3. Удобная структура таблицы u111, для отображения статистики.

Проблема

Можно ли сделать шаг 2 и 3 (а может и 4) одним SQL запросом? Типа так:
CODE (SQL):
скопировать код в буфер обмена
  1. INSERT INTO u111 (hours, duration) SELECT DATE_FORMAT(date,'%d %b %Hh') AS hours, (count(*) * 5) AS duration FROM u111_temp GROUP BY `hours`


В данном случае будет ошибка, потому что формат даты не совпадает, а мне бы хотелось всё и везде хранить в timestamp

Структура таблиц:
Спойлер (Отобразить)

Спойлер (Отобразить)
wmaster Отправлено: 04 Декабря, 2011 - 04:57:04 • Тема: расчет времени проведенного онлайн • Форум: SQL и Архитектура БД

Ответов: 22
Просмотров: 127
Задача узнать и показать на графике (график это уже дело десятое) активность пользователя: в какое время был, в какое нет + соотношение онлайн/офлайн.

Есть скрипт который опрашивает статус пользователя каждый 5-10 минут, в сети он или нет. Если в сети - 1, нет - 0. Скрипт простой и по необходимости можно внести логику.

база состоит из таблиц с именами пользователей: u1, u2...

структура таблицы:

    `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `status` tinyint(4) NOT NULL


Проблемы:

1. Тупо собирать 1 и 0 очень накладно. На одного пользователя выходит порядка 300 строк в сутки. Поэтому можно немного хитрить. Допустим в 12:00 user1 online, пишем в БД (1), а в 15:30 ему валить пора, тогда и пишем в базу новую строку (0). Более экономично, даже если user1 будет часто туда-сюда "бегать".


2. Как высчитать, время онлайн или офлайн по каждому пользователю? Не пойму, как сложить эти интервалы Улыбка

Могу переделать все с нуля, просто не могу понять, как лучше реализовать, чтобы БД не распухла через месяц и в человеко понятном виде смотрелось Улыбка

Возможно где-то есть уже похожее, я бы поковырялся.
wmaster Отправлено: 03 Декабря, 2011 - 02:23:07 • Тема: api vkontakte php-скрипт статус пользователя • Форум: Вопросы новичков

Ответов: 0
Просмотров: 145
Не могу разобраться, как через API получить список (id) своих друзей, делать это нужно не часто, допустим, раз в месяц. Список этот куда-нибудь сохраняется (mysql, txt, csv), чтобы потом отслеживать пользователь онлайн или нет.

Если первая часть задачи довольно сложная (я предчувствую), то можно обойтись и простым опросом статусов друзей (тупо ручками создам файл со списком нужных id).

Братцы, как это сделать? Google наталкивал меня на какие-то куски кода, которые толком не работают.

Нужно ли мне обязательно создавать свое приложение и регистрировать его в ВК, чтобы использовать API в поставленной задаче?

То, что мне попалось, но не завелось:

http://gliffer[dot]ru/articles/php--[dot][dot][dot]teley-vkontakte/
http://touchdev[dot]ru/documents/3037
http://code[dot]google[dot]com/p/vk-secapi/

Страниц (1): [1]
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB