7

好的,所以我必须执行一些讨厌的 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

4

2 回答 2

4

应该做的伎俩:

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

于 2013-11-08T06:45:18.073 回答
0

为每个用户添加一个会话时间列,当用户注销时更新该列。那么这只是一个求和应用程序该列的问题。当然,它只会向您显示已注销用户的时间,而不管他们可能已再次登录的事实。

于 2016-03-07T11:53:01.207 回答