我在 mysql 中有一个表来记录用户操作。表中的每一行对应一个用户操作,如登录、注销等。
该表如下所示:
CREATE TABLE IF NOT EXISTS `user_activity_log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`action_type` smallint NOT NULL,
`action_created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
id user_id action_type action_created
...
22 6 1 2013-07-21 14:31:14
23 6 2 2013-07-21 14:31:16
24 8 2 2013-07-21 14:31:18
25 8 1 2013-07-21 14:45:18
26 8 0 2013-07-21 14:45:25
27 8 1 2013-07-21 14:54:54
28 8 2 2013-07-21 15:09:11
29 6 1 2013-07-21 15:09:17
30 6 2 2013-07-21 15:09:29
...
想象一下操作 1 是登录,2 是注销,我想找出id 为 6 的用户在特定日期范围内登录的总时间(以小时:分钟:秒为单位)。
我的第一个想法是使用操作 1 或 2 获取所有行并自己计算 PHP 中的日期差异。这看起来相当复杂,我相信这也可以在一个使用 mysql 的查询中完成!
我尝试的是这样的:
SELECT TIMEDIFF(ual1.action_created, ual2.action_created) FROM user_activity_log
ual1,user_activity_log ual2 WHERE ual1.user_id = 6 AND ual2.user_id = 6 AND
ual1.action_type = 1 AND ual2.action_type = 2 AND
DATE(ual1.action_created) >= '2013-07-21' AND
DATE(ual1.action_created) <= '2013-07-21'
ORDER BY ual1.action_created
从同一用户的 ual1 中选择所有登录事件和从 ual2 中的所有注销事件,然后计算 2013.7.21 天的成对时间差,这实际上不起作用,我不知道为什么。
我如何计算总登录时间(所有时间差的总和,日期操作 2 - 日期操作 1)?正确操作的结果应该是2 seconds from log id pair 22,23 + 12 seconds from log id pair 29,30 = 14 seconds。
非常感谢您提前提供的帮助。此致