基于登录/注销条目的MySQL在线查询总时长
好的,所以我必须执行一些令人讨厌的MySQL查询,而且我不能为了我的生活而想到如何去做。
我有以下内容:
id date name join_or_leave
1 yyyy-mm-dd hh-mm-ss user1 join
2 yyyy-mm-dd hh-mm-ss user2 join
3 yyyy-mm-dd hh-mm-ss user1 leave
4 yyyy-mm-dd hh-mm-ss user3 join
5 yyyy-mm-dd hh-mm-ss user2 leave
6 yyyy-mm-dd hh-mm-ss user1 join
7 yyyy-mm-dd hh-mm-ss user4 join
8 yyyy-mm-dd hh-mm-ss user1 leave
因此它会记录用户的所有登录/注销时间。
我必须计算的是在线花费的总时间(所有用户的总时间,但是如果得到所有用户的总数将会非常缓慢,那么在得到每个用户的总和后,我可以计算出总数)。
希望这很明显,我需要在这里做什么,显然所有的日期都在下降(所以无论何时添加/离开条目); 但我怎么去做这件事我只是不知道。 :p
应该这样做:
SELECT
player_name,
TIME_FORMAT(SEC_TO_TIME(
IF(SUM(TIME) < 0,
SUM(TIME) + TO_SECONDS(NOW()),
IF(SUM(TIME) > 63000000000, SUM(TIME) - TO_SECONDS(NOW()), SUM(TIME))
)
),'%Hh %im') AS TOTAL_TIME
FROM
(
SELECT
TO_SECONDS(c.date) * - 1 AS TIME, c.player_name
FROM player_playtime c
WHERE join_or_leave = 'join'
UNION
SELECT
TO_SECONDS(date) AS TIME, player_name
FROM player_playtime
WHERE join_or_leave = 'leave'
) t
GROUP BY player_name WITH ROLLUP
;
小提琴:http://sqlfiddle.com/#!2/ebe7a1/4
为每个用户添加一个会话时间列,在用户注销时更新该列。 那么这只是一个总结应用程序该列的问题。 当然,它只会显示已注销用户的时间,而不考虑他们可能已重新登录的事实。
链接地址: http://www.djcxy.com/p/17007.html上一篇: MySQL Query For Total Online Time Based On Login/Logout Entries