8

彼がアプリケーションに接続しているときに、データベースに 2 ~ 5 秒ごとに ping を実行するシステムを取得しました。彼の接続に応じて、ping の時間枠は 10 秒ほど長くなる場合があります。

例:

Pings: 1,4,6,8,9,12,16,20,50,180,187,189,200,203,206,210 ...

クエリを実行して、ping 間の 1 分を超えない範囲を取得し、それらをグループ化して、ユーザーが接続されている時間を確認し、次のような新しいテーブルに保存します。

Connections table:
user: X | start_date: 1   | end_date: 50  | duration: 49
user: X | start_date: 180 | end_date: 210 | duration: 30

,50,180, ... からの ping が 1 分を超えたため、クエリ グループによって考慮されませんでした。

ping はタイムスタンプとして保存されるため、簡単に日付に変換できます。また、最後の ping から最初の ping までの範囲からセッションの継続時間がわかります。

とにかくMySQLクエリでそれを行うことはありますか? 何か助けはありますか?

編集: ping 履歴スキーマの追加

id  int(11)
user_id int(11)
ping_timestamp  int(11)

ありがとう、

4

2 に答える 2

6

複数のユーザー ID でどのように機能するかを示すために、指定されたサンプル データを 2 倍にしました。

sqlfiddle here でライブで動作することを確認してください。

select
userid, groupnum,
min(ping) as start_date,
max(ping) as end_date,
max(ping) - min(ping) as duration
from (
select
*,
@groupnum := if(@prevUser != userId, @groupnum + 1, @groupnum),
@groupnum := if(ping - @prevTS > 60, @groupnum + 1, @groupnum) as groupnum,
@prevUser := userid,
@prevTS := ping
from
Table1 t
, (select @groupnum:=1, @prevTS:=NULL, @prevUser:=NULL) vars
order by userid, ping
) sq
group by userid, groupnum
于 2013-09-24T14:24:43.753 に答える
4

あなたのデータでこれを試してください:

set @rnum = 1;
select user_id
     , min(ping_timestamp) start_date
     , max(ping_timestamp) end_date
     , max(ping_timestamp)-min(ping_timestamp) duration
  from ( select user_id
              , ping_timestamp
              , @rnum := if(ping_timestamp - @prev_ping_ts > 60, @rnum+1, @rnum) rnum
              , @prev_ping_ts := ping_timestamp
           from test2
          order by user_id, ping_timestamp
       ) t
 group by user_id, rnum
;
于 2013-09-24T14:56:08.327 に答える