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 に答える