立即获得授权用户mysql

时间:2019-02-27 08:43:38

标签: mysql sql

我有表结构:

enter image description here

我需要获得最后一个授权用户,其状态为“已登录”,而最后一个状态为“已注销”。我该怎么办?

我有一个查询:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE yyyy.MM.dd HH:mm:ss.SSS 'GMT'xxx");

但这使我成为最后一个授权用户SELECT * FROM vtiger_loginhistory WHERE status = 'Signed in' ORDER BY login_time DESC LIMIT 1 ,为什么?如果他是admin。我需要得到Signed off,因为他倒数Igor

5 个答案:

答案 0 :(得分:0)

您也可以检查不在列表中的用户名

SELECT * 
FROM vtiger_loginhistory 
WHERE status = 'Signed in' 
AND username NOT IN (
  select username 
  from vtiger_loginhistory 
  where  status = 'Signed OFF' 
)
ORDER BY login_time DESC LIMIT 1

答案 1 :(得分:0)

您可以使用not exists

尝试以下方法
 select t1.* from vtiger_loginhistory t1
 where 
  status = 'Signed in'
 and not exists ( select 1 from vtiger_loginhistory t2 
                  where t2.user_name=t1.user_name 
                  and status = 'Signed off') 
 order by STR_TO_DATE(login_time,'%Y%m%d %h%i') DESC LIMIT 1

我认为您的login_time列不是日期时间

答案 2 :(得分:0)

您可以尝试:首先为每个username选择一个较新的行,然后使用JOIN或另一个SELECT来查看它是“输入”还是“关闭”

编辑:概念相同,但多亏了this answer

我不完全了解的版本:https://sqltest.net/#464377

SELECT *
FROM vtiger_loginhistory v_l
LEFT JOIN vtiger_loginhistory tmp
    ON (v_l.user_name = tmp.user_name AND v_l.login_time < tmp.login_time)
WHERE tmp.login_time IS NULL AND v_l.status = 'Signed in'
ORDER BY v_l.login_time DESC LIMIT 1

与我描述的子查询类似的结果(似乎慢于链接答案中的解释):https://sqltest.net/#464385

SELECT *
FROM vtiger_loginhistory v_l
INNER JOIN (SELECT user_name, MAX(tmp.login_time) AS maxlogintime
            FROM vtiger_loginhistory tmp GROUP BY user_name
            ORDER BY login_time DESC) tmp2
    ON (v_l.login_time = tmp2.maxlogintime)
WHERE status = 'Signed in' 
ORDER BY login_time DESC LIMIT 1

已编辑的原始不适用版本 :(因为GROUP BY使第一行保持符合状态,因此最早的日期仍是

SELECT * 
FROM (
    SELECT *
    FROM vtiger_loginhistory 
    GROUP BY user_name
    ORDER BY login_time DESC
) as temp
WHERE status = 'Signed in' 
ORDER BY login_time DESC LIMIT 1

答案 3 :(得分:0)

Signed inSigned off用户很多,admin已注销,但最后一次登录比Igor更新。

为您提供2种解决方案:

  1. 当用户Signed off只是更新状态而不是创建新记录时,请更新流程
  2. 首先创建top1signedoff临时表,然后选择不在top1signedoff中的另一个表

    创建临时表top1signedoff从vti​​ger_loginhistory中选择用户名WHERE status ='Signed off'ORDER BY login_time DESC LIMIT 1;

    选择*从vtiger_loginhistory
        WHERE状态=“已登录”     和用户名Not IN(         从top1signedoff中选择用户名     )
    ORDER BY login_time DESC LIMIT 1

答案 4 :(得分:0)

以下查询应会为您提供所需的结果

SELECT t.login_id,t.user_name, t.logout_time,t.login_time,t.status
FROM vtiger_loginhistory t
WHERE t.login_id = (
            SELECT MAX(t2.login_id)
            FROM vtiger_loginhistory t2
            WHERE t2.user_name = t.user_name
            GROUP BY t2.user_name
        )
    AND t.status = 'Signed in';

我们在这里做什么。

在子查询中,我们正在获取用户的最后login_id

,在主查询中,我们正在检查该status的{​​{1}}是否为login_id