mysql获取与其他记录有时差的记录

hjzp0vay  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(346)

我有一个mysql db表,记录用户登录和注销活动。我需要选择所有用户记录谁没有重新登录后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超出记录4和8之间的20分钟间隔用户2超出记录7和9之间的20分钟间隔
所以这应该说明

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

如何编写查询来完成此操作?

vyu0f0g1

vyu0f0g11#

如果两排相隔20分钟,你似乎对它们都感兴趣。以下尝试模拟超前和滞后:

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'
flvtvl50

flvtvl502#

这回答了一个问题:
我需要选择所有用户记录谁没有重新登录后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;

您的示例结果包括登录结果。根据你提出的问题,目前还不清楚这些是如何定义的。

相关问题