2011-02-09 8 views
0

は、私は次の列でsys_event_logという名前のテーブルを持っている存在ログインの成功 "または"ログアウトイベント "に基づいて、ログアウトしていないデータベースにログインしている別のユーザーのリストを返そうとしています。イベント・ログevent_typesおよびtime_stampsに0を設定します。アクセスSQLクエリのヘルプ使用していない

私は今のところ出ているクエリは次のとおりです。

SELECT DISTINCT 
    a.user_name, 
    a.event_type, 
    a.time_stamp 
FROM 
    sys_event_log a 
WHERE NOT EXISTS 
(
    SELECT 
      1 
    FROM 
      sys_event_log b 
    WHERE 
      b.time_stamp > a.time_stamp 
      AND a.user_name = b.user_name 
      AND a.event_type = "Logout Event" 
) 
AND a.event_type = "Login Success"; 

それは近いと感じたが、それは予想されるデータセットを返していません。

+0

うこの作品を同じユーザーですか? –

+0

@ypercubeそれは問題ですか?その場合、2つの結果があります(1)最後のエントリはログアウト=>ユーザーがリストされていません(2)最後のログアウト後に複数のログインがある>>ユーザーが複数回リストされます**ログインごとに1回** – RichardTheKiwi

+0

ですから、event_log:login、login、login、logoutの中にいれば、まだアクティブなログインが2つあるうちにユーザーはリストされません。正しい?回答には –

答えて

1
SELECT a.user_name 
     , COUNT(*) AS logins 
     , (SELECT COUNT(b.time_stamp) 
      FROM sys_event_log b 
      WHERE b.user_name = a.user_name 
       AND b.event_type = "Logout Event" 
     ) AS logouts 
     , logins - logouts AS activeConnections 
    FROM sys_event_log a 
    WHERE a.event_type = "Login Success" 
    GROUP BY a.user_name 
    HAVING logins > logouts 
+0

私はこのクエリを明示的に保存します。複数の同時接続の問題は決して大きな問題ではありませんでした。ほとんどの場合、ユーザーはそのようなものを達成する方法を知りませんし、そうしたくないかもしれませんが、問題が発生する可能性があることがわかりました。 – Patrick

+0

最終的な目標は、誰もが切断される必要があるときに、アプリケーションに積極的に接続されているかどうかを判断できるからです(データベースの更新を行う必要があり、25人のユーザーのうち、彼が休暇を取ったときにコンピュータを離れてしまったことが判明しました。本当の話です)単純な変更(アクティブな接続数> 0)を行うことで、これはうまくいくはずです。 – Patrick

1

あなたがここに

b.event_type = "Logout Event" 

を使用する場合は、このお試しください

 b.time_stamp > a.time_stamp 
     AND a.user_name = b.user_name 
     AND a.event_type = "Logout Event" 
+0

目障りなエラーは、常に最悪です...私はちょうどそれを見て他の誰かが必要だと思う!ありがとう(私に8分の答えとして受け入れさせません) – Patrick

+1

@cyberwiki:私は上記の質問にもう一つの欠陥があると思います。ユーザーが多数の(同時の)接続を行うことができればうまく動作しません。 –

1

より多くの意味を行います:あなたは、複数の同時接続を許可している場合、正しく

SELECT 
    a.user_name, 
    a.event_type, 
    a.time_stamp 
FROM 
    sys_event_log a 
WHERE a.event_type = "Login Success" AND 
    a.time_stamp = (SELECT MAX(b.time_stamp) 
        FROM sys_event_log b 
        WHERE b.user_name = a.user_name) 
+0

私はそれもそうすると信じています。私はそれをテストしなければならないだろうが、ロジックはしっかりと見える。 – Patrick

+0

サブクエリにb.time_stamp> a.timestampという条件を設定すると、より効率的です。私のバージョンは、b.time_stamp> = a.time_stampを追加してサブクエリを条件づけることで改善できます。 –

+0

質問に対するコメントの表示 - これはコメントの意味をコメントとして変更し、ログイン/ログアウトを超えて他のイベントタイプを含むと機能しません。 – RichardTheKiwi