MySQL Получить записи, имеющие разницу во времени с другими записями - PullRequest
0 голосов
/ 23 ноября 2018

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

Пример: Таблица: Журнал

ID | User | Event  | Time
-----------------------------
1  | 1    | LOGIN  | 10:00:00
2  | 2    | LOGIN  | 10:05:00
3  | 3    | LOGIN  | 10:15:00
4  | 1    | LOGOUT | 11:00:00
5  | 3    | LOGOUT | 11:01:00
6  | 2    | LOGIN  | 12:20:00
7  | 2    | LOGOUT | 12:30:00
8  | 1    | LOGIN  | 12:31:00
9  | 2    | LOGIN  | 12:55:00

В соответствии с этим примером таблицы, пользователи, которые превышаютпромежуток между их выходами из системы и логинами должен быть показан на 20 минут.Пользователь 1 превышает 20-минутный промежуток между записями 4 и 8. Пользователь 2 превышает 20-минутный промежуток между записями 7 и 9

. Таким образом, это должно показать

ID | User
----------
4  | 1
8  | 1
7  | 2
9  | 2

Как мне написать запрос всделать это?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Вы, похоже, заинтересованы в получении обеих строк, если они находятся на расстоянии 20 минут.Следующие попытки эмулируют LEAD и LAG:

SELECT * FROM (
    SELECT *, (
        SELECT CASE WHEN EVENT = 'LOGOUT' AND main.Event = 'LOGIN' THEN TimeDIFF(main.Time, Time) END
        FROM t AS prev
        WHERE User = main.User AND Time < main.Time
        ORDER BY Time DESC
        LIMIT 1
    ) AS diff_lag, (
        SELECT CASE WHEN EVENT = 'LOGIN' AND main.Event = 'LOGOUT' THEN TimeDIFF(Time, main.Time) END
        FROM t AS next
        WHERE User = main.User AND Time > main.Time
        ORDER BY Time ASC
        LIMIT 1
    ) AS diff_lead
    FROM t AS main
) x
WHERE diff_lag > '00:20:00' OR diff_lead > '00:20:00'

В качестве альтернативы попробуйте следующий подход, который, кажется, работает, за исключением того, что он объединяет обе строки:

SELECT *
FROM t AS o
INNER JOIN t AS i ON o.User = i.User AND o.Time < i.Time                    -- join logouts with potential logins
LEFT JOIN t AS x ON o.User = x.User AND o.Time < x.Time AND x.Time < i.Time -- any row present between logout and login
WHERE o.Event = 'LOGOUT' AND i.Event = 'LOGIN' AND x.ID IS NULL AND TIMEDIFF(i.Time, o.Time) > '00:20:00'
0 голосов
/ 23 ноября 2018

Это отвечает на вопрос:

Мне нужно выбрать все записи пользователей, которые не вошли в систему в течение 20 минут после выхода из системы.

select lo.*
from (select l.*,
             (select min(l2.time)
              from logs l2
              where l2.user = l.user and l2.time > l.time and
                    l2.event = 'LOGIN'
             ) as next_login_time
      from logs l
      where l.event  = 'LOGOUT'
     ) lo
where next_login_time > time + interval 20 minute;

Ваш образецрезультаты включают в себя результаты входа.Неясно, как они определяются, исходя из вопроса, который вы задали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...