ユーザーがアプリケーションに接続しているときに、2 ~ 5 秒ごとにデータベースに ping を実行するシステムを取得しました。彼の接続に応じて、ping の時間枠は 10 秒ほど長くなる場合があります。
例:
Pings: 1,4,6,8,9,12,16,20,50,180,187,189,200,203,206,210 ...
ping 間の 1 分を超えない範囲を取得してグループ化するためのクエリを実行しているので、ユーザーが接続されている時間を知ることができます。
この質問について@fancyPantsがアドバイスしたように、結果を選択するために実行しているクエリは次のとおりです 。MySQL query to group results by date range?
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
次の結果が生成されます。
user: X | start_date: 1 | end_date: 50 | duration: 49
user: X | start_date: 180 | end_date: 210 | duration: 30
このクエリに、次のことを行うステートメントを追加して、助けが必要です。
1位。選択した行を、クエリが返すスキーマとまったく同じ新しいテーブルに挿入します。
id: auto_increment| user: X | start_date: 1 | end_date: 50 | duration: 49
id: auto_increment| user: X | start_date: 180 | end_date: 210 | duration: 30
2番目。クエリで選択され、新しいテーブルに挿入された、選択された行を削除します。
このクエリは、サーバー上の cronjob によって 10 分ごとに実行されます。そのため、大きな打撃を受ける可能性のある ping テーブルをクリーンアップし、サーファーに表示する値を新しいテーブルに保存できます。
新しいクエリでは、有効期限が切れていない ping をフィルター処理する句が必要です。有効期限が切れていない ping は、cron が実行される現在の時刻から 60 秒以内に実行されたものです。たとえば、現在 = 100 の場合、最後に取得する ping は 41 未満にすることはできません。このようにして、cron の実行時に、まだデータベースに ping しているユーザーから行を選択しません。
1 回のクエリで実行できますか、それとも 2 回必要ですか?
ありがとう、