2012-01-09 61 views
0

以下查询显示基于userId的登录信息。如果用户关闭浏览器而未注销或会话过期,则logoff_date将保持为空,如下例所示。上一行取决于当前行的值

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 

因为有 logon_date的2012-01-01 10:00:00,我知道,用户必须杀了会议,以便2012-01-01 09:00 login_date: 00。

这里是我的查询:

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

我想是只计算活动会话。为了做到这一点,如果存在具有相同userId的新行,我需要跳过缺少logoff_date的行。

+0

您在此表中是否有自动递增主键? – zerkms 2012-01-09 03:59:02

+0

@zerkms,不,它不是auto_increment。我正在使用主键的会话散列。 – Muzz 2012-01-09 04:00:42

回答

0

如何:

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 

PS:此查询意味着每个日期只有特定用户的一条记录

+0

Serk,谢谢...让我试试这个,我会让你知道这是如何解决的。 brb – Muzz 2012-01-09 04:04:37

+0

Zerk,我从这个查询中找不到任何行。我刚刚看到您的编辑,并且此表包含所有登录信息,因此每个用户将有多行记录。 – Muzz 2012-01-09 04:09:45

+0

@Mr。溢出:呃,我不相信,它应该工作。内部查询返回什么? – zerkms 2012-01-09 04:10:28

相关问题