1

良い一日を。

私はこの環境を持っています:Mysql dbでは、ユーザーがサイトにログインするたびに、彼の名前とログイン時刻を含む新しい行が作成されます。システムは相互排他的であるため、特定の時間に存在するユーザーは 1 人だけであり、新しいユーザーが到着すると、ログに記録されたユーザーはログオフされます。

システム上のすべてのユーザーの合計時間を計算するように求められたので、基本的に、ログインと次のログインからのすべての時間差を合計する必要があります。

user  |       timestamp     |
------------------------------
alpha | 2013-01-19 03:14:07
beta  | 2013-01-20 11:24:04
alpha | 2013-01-21 02:11:37
alpha | 2013-01-21 03:10:31    <---- a user could login twice, it is normal
gamma | 2013-01-21 11:24:04
beta  | 2013-01-21 11:25:00

ログイン数が多いので、ご意見をお聞きしたいのですが、ユーザーの総ログイン時間を計算するには、どのようにするのが一番良いのでしょうか? この例では、"gamma" のログイン時間は 56 秒で、ベータ版の最後のログインは無視できます。これは、このチェックの実行時にオンラインになるためです。したがって、「ベータ版」には 1 つのエントリしかありません。

クエリで計算する方法はありますか?または、「オンライン時間」列を追加して、ユーザーがログアウトするたびにオンラインで費やした時間をシステムに計算させる方がよいでしょうか?

4

2 に答える 2

1

これを試してみてください...それ以下かそれ以上が問題の解決策です...

    CREATE TABLE `matteo` (
      `user` varchar(20) DEFAULT NULL,
      `timestamp` int(11) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

    INSERT INTO matteo(user, `timestamp`) VALUES ('alpha', 7);
    INSERT INTO matteo(user, `timestamp`) VALUES ('beta', 9);
    INSERT INTO matteo(user, `timestamp`) VALUES ('alpha', 17);
    INSERT INTO matteo(user, `timestamp`) VALUES ('alpha', 27);
    INSERT INTO matteo(user, `timestamp`) VALUES ('gamma', 77);
    INSERT INTO matteo(user, `timestamp`) VALUES ('beta', 97);

    select a.*,b.*,b.`timestamp`-a.`timestamp` as delta
    from
    (SELECT @rownum := @rownum + 1 AS id,t.*
          FROM matteo t,(SELECT @rownum := 0) r) a
    join
    (SELECT @rownum2 := @rownum2 + 1 AS id,t.*
          FROM matteo t,(SELECT @rownum2 := 0) r) b 
    where a.id=b.id-1

:-) 月曜日に会いましょう!!!

于 2013-11-07T17:36:14.283 に答える