计算每个用户两次登录之间的时间

问题描述 投票:0回答:1

我有一个包含唯一ID,开始时间,结束时间和用户ID的表,我们称此表为User_Logged_In,其中开始时间是用户登录时的时间,结束时间是他们注销时的时间。

我正在尝试显示最近5个计算的“自上次活动以来的时间”时间,以天/小时/分钟/秒为单位,按各个用户(用户ID)分组,并从最新到最旧排序。

用户A可能有3次登录,用户B可能有12次登录,用户C可能有8次登录。对于每个用户,我正在寻找每次登录之间的离线时间。按用户排序,然后按启动时间DESC排序,我希望每个用户的最新记录都没有值。

示例:

+------+---------------------+---------------------+---------+
|  id  | starttime           | endtime             | user_id |
+------+---------------------+---------------------+---------+
|  35  | 2018-12-19 15:20:45 | 2018-12-19 19:21:06 | 1       |
|  22  | 2018-12-19 14:51:39 | 2018-12-19 21:56:40 | 1       |
|  11  | 2018-01-05 14:28:17 | 2018-01-05 21:30:42 | 1       |
|  97  | 2019-09-25 13:17:34 | 2019-09-25 23:31:31 | 2       |
|  86  | 2019-07-31 20:42:16 | 2019-07-31 22:42:38 | 2       |
|  72  | 2019-05-21 17:49:21 | 2019-05-21 20:03:03 | 2       |
|  83  | 2019-07-31 14:30:39 | 2019-07-31 20:30:58 | 3       |
|  79  | 2019-07-30 13:49:23 | 2019-07-30 23:59:01 | 3       |
|  61  | 2019-04-12 15:03:25 | 2019-04-13 01:54:23 | 3       |
|  54  | 2019-02-03 06:45:33 | 2019-02-03 17:33:48 | 3       |
|  51  | 2019-01-29 09:12:15 | 2019-01-23 14:44:38 | 3       |
+------+---------------------+---------------------+---------+

http://sqlfiddle.com/#!9/0dba46/2

最终结果:

+----+---------------------+---------------------+-------------------------------------------+---------+
| id | starttime           | endtime             | difference                                | user_id |
+----+---------------------+---------------------+-------------------------------------------+---------+
| 35 | 2018-12-19 15:20:45 | 2018-12-19 19:21:06 | -                                         | 1       |
+----+---------------------+---------------------+-------------------------------------------+---------+
| 22 | 2018-12-19 14:51:39 | 2018-12-19 21:56:40 | 0 Days, 6 Hours, 35 Minutes, 55 Seconds   | 1       |
+----+---------------------+---------------------+-------------------------------------------+---------+
| 11 | 2018-01-05 14:28:17 | 2018-01-05 21:30:42 | 347 Days, 17 Hours, 57 Minutes, 23 Seconds | 1       |
+----+---------------------+---------------------+-------------------------------------------+---------+
| 97 | 2019-09-25 13:17:34 | 2019-09-25 23:31:31 | -                                         | 2       |
+----+---------------------+---------------------+-------------------------------------------+---------+
| 86 | 2019-07-31 20:42:16 | 2019-07-31 22:42:38 | 55 Days, 14 Hours, 56 Minutes, 15 Seconds  | 2       |
+----+---------------------+---------------------+-------------------------------------------+---------+
| 72 | 2019-05-21 17:49:21 | 2019-05-21 20:03:03 | 71 Days, 0 Hours, 39 Minutes, 13 Seconds  | 2       |
+----+---------------------+---------------------+-------------------------------------------+---------+
| 83 | 2019-07-31 14:30:39 | 2019-07-31 20:30:58 | -                                         | 3       |
+----+---------------------+---------------------+-------------------------------------------+---------+
| 79 | 2019-07-30 13:49:23 | 2019-07-30 23:59:01 | 1 Days, 6 Hours, 41 Minutes, 35 Seconds   | 3       |
+----+---------------------+---------------------+-------------------------------------------+---------+
| 61 | 2019-04-12 15:03:25 | 2019-04-13 01:54:23 | 108 Days, 11 Hours, 55 Minutes, 0 Seconds | 3       |
+----+---------------------+---------------------+-------------------------------------------+---------+
| 54 | 2019-02-03 06:45:33 | 2019-02-03 17:33:48 | 67 Days, 21 Hours, 29 Minutes, 37 Seconds  | 3       |
+----+---------------------+---------------------+-------------------------------------------+---------+
| 51 | 2019-01-29 09:12:15 | 2019-01-23 14:44:38 | 10 Days, 16 Hours, 0 Minutes, 55 Seconds   | 3       |
+----+---------------------+---------------------+-------------------------------------------+---------+

此值将是较大数据集中的一列。我已经尝试了许多不同的方法,包括联接回到同一张表,但是找不到快速返回该值的方法,或者根本找不到。

当前在MySQL v5.6上。

我有一个包含唯一ID,开始时间,结束时间和用户ID的表,我们将此表称为User_Logged_In,其中开始时间是用户登录时的时间,结束时间是他们登录时的时间...

mysql query-optimization
1个回答
0
投票

已经从您的SQLFiddle链接中获取了代码,我创建了一个似乎想要的输出。所有这些都依赖于函数TIMESTAMPDIFFSEC_TO_TIMETIME_FORMAT,您可能不需要所有结果列,我选择了以秒为单位的差,只是为了获得所需输出的中间结果。以下查询可能满足要求:

© www.soinside.com 2019 - 2024. All rights reserved.