我有表结构:
我需要获得最后一个授权用户,其状态为“已登录”,而最后一个状态为“已注销”。我该怎么办?
我有一个查询:
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
。
答案 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 in
和Signed off
用户很多,admin
已注销,但最后一次登录比Igor
更新。
为您提供2种解决方案:
Signed off
只是更新状态而不是创建新记录时,请更新流程首先创建top1signedoff
临时表,然后选择不在top1signedoff
中的另一个表
创建临时表top1signedoff从vtiger_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