1

フィールドID、PLAYER、TIMESTAMP、およびACTIONを持つMySQLテーブルLOGIN_LOGがあります。ACTION は「ログイン」または「ログアウト」のいずれかです。ログインの約 20% のみがログアウト行を伴います。そうする人のために、平均期間を計算したいと思います。

みたいなことを考えている

select avg(LL2.TIMESTAMP - LL1.TIMESTAMP)
from LOGIN_LOG LL1
inner join LOGIN_LOG LL2 on LL1.PLAYER = LL2.PLAYER and LL2.TIMESTAMP > LL1.TIMESTAMP
left join LOGIN_LOG LL3 on LL3.PLAYER = LL1.PLAYER
  and LL3.TIMESTAMP between LL1.TIMESTAMP + 1 and LL2.TIMESTAMP - 1
  and LL3.ACTION = 'login'
where LL1.ACTION = 'login' and LL2.ACTION = 'logout' and isnull(LL3.ID)

これが最善の方法ですか、それとももっと効率的な方法がありますか?

4

4 に答える 4

1

あなたが持っているデータを考えると、LOGIN と LOGOUT レコードを見て、2 つの間に同じユーザーの他の LOGIN (または LOGOUT?) レコードがないことを確認する必要があるため、これ以上速くできることはおそらくないでしょう。 .

または、切断時にログアウトが記録されるようにする方法を見つけて、データが完全になるようにします (20% ではなく)。ただし、クエリはおそらく条件がすべて満たされていることを確認する必要があるため、クエリはそれほど役に立ちません。

LOGIN 時間と対応する LOGOUT 時間の両方が同じレコードにある形式にデータを取得できれば、クエリを大幅に簡素化できます。SessionManager がそれを行うかどうかはわかりません。

于 2008-12-08T20:41:50.667 に答える
0

セッションをタイムアウトできる SessionManager タイプのオブジェクトはありますか? そこにタイムアウトが記録される可能性があり、それとタイムアウト期間から最後のアクティビティ時間を取得できるためです。

または、Web サイト/サービスのすべてのアクティビティをログに記録し、Web サイト/サービスの訪問時間を直接クエリして、実行したアクティビティを確認できます。Web サイトの場合、Apache ログ アナライザーはおそらく必要な統計情報を生成できます。

于 2008-12-08T20:35:10.413 に答える
0

私は JeeBee に同意しますが、SessionManager タイプ オブジェクトのもう 1 つの利点は、sessionEnd イベントを処理して、アクティブな時間を含むログアウト行を書き込めることです。このようにして、20% の付随するログアウト行から 100% の付随するログアウト行になる可能性があります。アクティビティ時間のクエリは簡単で、すべてのセッションで一貫しています。

于 2008-12-08T20:40:24.770 に答える
0

ユーザーの 20% だけが実際にログアウトした場合、この検索で​​は各セッションの正確な時間が得られません。平均的なユーザー セッションの長さを測定するより良い方法は、アクション間の平均時間、つまり avg を取ることです。ページあたりの時間。これに、訪問ごとのページ/アクションの平均数を掛けると、より正確な時間が得られます。

さらに、平均を決定できます。各ページの時間を取得し、セッション終了時間 = その時点までのセッション時間 + 最後のページに費やされた平均時間を取得します。これにより、セッションごとに費やされた時間をよりきめ細かく (かつ正確に) 測定できます。

与えられた SQL に関しては、実際に必要以上に複雑なようです。この種の統計操作は、多くの場合、統計計算のための SQL のやや複雑な機能だけでなく、選択した言語をフルに活用できるデータベース外部のコードで、より適切に処理/保守することができます。

于 2008-12-08T20:42:27.153 に答える