| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > Нужна помощь при разборе данных из бд mysql |
| Автор: jone31 12.7.2010, 22:01 |
| всех приветствую. при подсчете времени которое пользователь был онлайн, возникла следующая проблемма: Есть БД MySQL, в ней таблица с логами входов/выходов юзеров, Далее я вытаскиваю из неё записи нужного мне юзера, за нужный промежуток времени, но вот есть трудность: запись входа пользователя обозначается как STAT_IN, а выхода STAT_OUT, и мне нужно получить промежуток времени между двумя этими записями, но как? насколько мне известно узнать следующий ход цикла, не прерывая предыдущий нельзя. слышал про перебор массивов, но никогда ещё с ним не работал, может как то с помощью него можно реализовать это? |
| Автор: нуп 12.7.2010, 22:47 | ||
Если правильно понял
Результат в милисекундах. Дальше сам переводи |
| Автор: CruorVult 13.7.2010, 09:41 |
а разве не в секундах? |
| Автор: jone31 13.7.2010, 10:02 | ||
| нет, алгоритм вычисления времени я уже написал. проблеммма не в этом. попробую ещё раз описать проблемму: вот таблица mysql:
|
| Автор: нуп 13.7.2010, 10:08 |
Да, пардон ошибся. Добавлено через 8 минут и 44 секунды jone31, \ у Вас хранится по 2 записи в таблице, когда юзер пришел и когда он ушел? |
| Автор: ksnk 13.7.2010, 14:16 | ||
| jone31, Разумнее было бы делать время прихода - ухода в одной строке таблицы. Так проблем с вычислениями не было бы. соотвестственно, при выходе юзера - ведем поиск записи входа этого с максимальным временем и вписываем ему время выхода. Или вообще при любом телодвижении юзера вписываем ему время выхода "time()+10 минут", а то реальный выход с сайта ловить достаточно нетривиально. если на каждую запись "прихода" юзера есть соответствующая запись "ухода" - можно построить запрос с join'ом, который всю таблицу вернет в нужном виде. Что такое user_sn - сессия юзера? если так, то запрос может быть примерно такой
Только в таблицу нужно будет добавить ключей - в user_sn и в type? иначе будет тормозить ... |
| Автор: jone31 13.7.2010, 20:25 | ||
| ksnk, речь идет не о сайте, а о чат-боте. `user_sn` - это ICQ номер с которого выполнен вход(он тоже уникален, но у одного пользователя их может быть несколько, поэтому по `user_id` ловить легче) нуп, нет, пользователь вошел и в лог пишется что он зашел, если он сам набрал команду выхода то в лог об этом записали. Но есть такие записи, где есть запись входа, но нету записи выхода(т.к. пользователя выкинуло из ICQ, вышел из аськи не выходя из чата и т.д.), такие записи в расчет не берутся. Берутся только парные записи, т.е. вход/выход. вот небольшой(150 строк) кусочек таблицы(поля user_sn и msg вырезаны):
STATE_IN и STATE_OUT - вход/выход значение OUT - сообщение |
| Автор: jone31 14.7.2010, 19:35 |
| ну неужели это невозможное действие? |
| Автор: bazzjr 15.7.2010, 06:16 | ||||
| jone31, если я правильно понял, то тебе нужно посчитать время из поля `time` до настоящего времени при `type`='STATE_OUT' ? Если так то:
теперь имеем к примеру в переменной $timeUserIn значение из базы дальше можно вычислить сколько он пробыл онлайн :
Ну или же возьми две других даты из базы STAT_IN и STAT_OUT. |
| Автор: bazzjr 15.7.2010, 06:32 |
| Немного подумав... наверно решение ksnk будет правильным. Чем оно не утраивает? |
| Автор: ksnk 15.7.2010, 09:37 | ||
| bazzjr, тем, что поля в базе имеют другой смысл jone31, Выбраная схема и дисциплина огранизации хранения данных не предполагает их реляционную обработку. Я не смог состряпать разумно выглядящий запрос, который бы сам все делал и считал для пользоателя время, проведенное им на сайте. Разве что выбрать все STATE_OUT и STATE_IN для пользователя, а потом вручную отсортировав по возрастанию времен, найти соответствующие пары и посчитать разницу. Хотя, возможно я просто не понял задачу
результат нужно проверить. если первая строчка результата - type==STATE_IN, то все в порядке, сессия не закрыта. время в онлайне будет time()-`ts` |
| Автор: jone31 15.7.2010, 12:22 |
| мне нужно узнать сколько он всего просидел в чате по данным лога. |
| Автор: ksnk 15.7.2010, 14:16 |
| jone31, тот-же запрос, но limit 2. Это даст нам пару значений - вход и выход юзера. если первая запись - вход - юзер еще сидит в онлайне. Если первая запись - выход, а вторая - вход, то сколько он сидел можно посчитать отняв первое значение времени от второго. При других значениях ответа база некорректна, надо бежать жаловаться создателю... |
| Автор: jone31 15.7.2010, 14:21 |
| суть проблеммы неправильна понята. там записей вход/выход тысячи. нужно их все сгрупировать по вход/выход, найти разницу во времени и все это сложить. |
| Автор: нуп 15.7.2010, 15:08 |
| Ну так чисти базу, заем тебе эти данные. И проще сделать 1 запись, кде будет 2 колонки - вход и выход |