2013-07-18 1 views
1

У меня есть приложение, написанное в MySQL с нижеуказанным форматом таблицы аудита. Мне нужно определить текущее количество пользователей, зарегистрированных в системе в любой момент времени в течение дня.

Я пробовал это с различными self-соединениями, подзапросами, timediff и даже конвертированием в unixtime плюс некоторые простые математики, однако я не могу придумать приемлемое решение.
Любые указатели или помощь оцениваются в значительной степени.MySQL определяет количество пользователей в часовом запросе системы


audit_table

user | action | time 
-----|--------|------ 
    1 | login | 2013-07-02 00:37:00 
    2 | login | 2013-07-02 00:38:00 
    1 | logout | 2013-07-02 00:39:30 
    3 | login | 2013-07-02 00:40:00 
    2 | logout | 2013-07-02 02:30:00 


Необходимый формат: час 24-часового рабочего дня | Количество пользователей, зарегистрированных в течение этого часа
примера (Обратите внимание, что пользователь 3 не вошел еще, таким образом, все еще показывает активность в счете в час 3)

hour | usersloggedin 
-----|--------------- 
    0 | 3 
    1 | 2 
    2 | 2 
    3 | 1 
+0

Дополнительные данные образца и ** всегда ** отправляйте то, что вы пробовали. Когда мы играем с вашими примерными данными, результат в настоящее время будет заключаться в том, что каждый пользователь попадает в строку часа = 0. Я предполагаю, что возможно, что у пользователя несколько логинов и выход из системы? Определяете ли вы каким-либо образом, какой логин относится к тому, что выйдет из системы? – fancyPants

ответ

3

Прежде всего вам необходимо создать таблицу для примера называется hours_table с номером от 00 до 23:

CREATE TABLE `hours_table` (`hour` char(2) DEFAULT NULL); 

hour 
---- 
00 
01 
02 
03 
04 
.. 

После выполнения этого запроса:

SELECT hour, (count(DISTINCT(li.user)) - count(DISTINCT(lo.user))) AS usersloggedin FROM hours_table  
LEFT JOIN audit_table AS li ON DATE_FORMAT(li.time, '%Y%m%d%H')<=CONCAT('20130702',hour) AND DATE_FORMAT(li.time, '%Y%m%d')='20130702' AND li.action='login' 
LEFT JOIN audit_table AS lo ON DATE_FORMAT(lo.time, '%Y%m%d%H')<CONCAT('20130702',hour) AND DATE_FORMAT(lo.time, '%Y%m%d')='20130702' AND lo.action='logout' 
GROUP BY hour 

на месте 20130702 вы положили В другой день в формате yyyymmdd удалите DATE_FORMAT (время,% Y% m% d ') =' 20130702 ', если вы сегодня считаете, что пользователь зарегистрировался вчера.

+0

Теперь я получаю правильное отображение часа | usersloggedin, но счет для зарегистрированных пользователей всегда равен 0. Добавляя те же 2 оператора подсчета, которые вы использовали для выбора для целей отладки, показывает мне, что они оба всегда = 1, что означает, что я всегда получить 1-1 = 0 в результатах. – user2593958

+0

Я проверил и этот метод работает нормально. Добавьте свой синтаксис sql. –

+0

Точно такой же синтаксис, как вы писали выше. Возможно, моя проблема связана с часовым столом, я создал и вставил значения, но мои значения 0 * отображаются только как 1,2,3,4 вместо 00,01,02,03. Тем не менее, это должно позволить все, что угодно, час = 10 или выше. Я использовал это для вставки, я предполагаю, что это неправильно - вставить в значения hours_table (hour) (00) – user2593958

 Смежные вопросы

  • Нет связанных вопросов^_^