2012-01-09 8 views
0

次のクエリは、userIdに基づいてログイン情報を表示します。ユーザーがログオフせずにブラウザを閉じたり、セッションが終了したりすると、logoff_dateは次の例のようにnullのままです。前の行は現在の行の値に依存します

userId logon_date    logoff_date 
1   2012-01-01 10:00:00  2012-01-01 12:00:00 
1   2012-01-01 09:00:00  NULL 

2012-01-01 10時00分00秒の新しい logon_dateがあるので、私は、ユーザーが2012年1月1日午前9時00分のlogin_dateのためのセッションを殺していなければならないことを知っています: 00。ここで

は私のクエリです:

SELECT userId, logon_date, logoff_date 
FROM user_logon 
WHERE user_id = 2 

私が望むどのようなアクティブ・セッションのみをカウントすることです。これを行うには、同じuserIdを持つ新しい行がある場合、logoff_dateがない行をスキップする必要があります。

SELECT l.* 
     FROM user_logon l 
INNER JOIN (SELECT MAX(logon_date) mdate, 
        user_id 
       FROM user_logon 
      GROUP BY user_id) x ON x.user_id = l.user_id 
          AND l.logon_date = x.mdate 
    WHERE l.logoff_date IS NULL 

:これについて

+0

のための1つのレコードのみが存在することを意味しますが、この表の自動インクリメントの主キーを持っていますか? – zerkms

+0

@zerkms、いいえ、auto_incrementではありません。私は主キーのセッションハッシュを使用しています。 – Muzz

答えて

0

どのように?

PS:このクエリは、各日付の特定のユーザー

+0

Serk、ありがとう...私はこれを試してみようと、これがどのように動作するかをお知らせします。 brb – Muzz

+0

Zerk、このクエリから行が戻ってきません。私はちょうどあなたの編集を見て、このテーブルはすべてのログインを保持するので、ユーザーごとに多くの行があります。 – Muzz

+0

@Mr。オーバーフロー:うーん、私は信じられない、それは動作するはずです。内側のクエリは何かを返しますか? – zerkms

関連する問題