如何查询特定时间段内无成功登录记录的用户
解决:查询指定时间段内未成功登录的用户
原查询的问题
你的SQL写法有两个关键问题:
- 左连接后在
WHERE里加bb.LogDate的范围条件,会把没有登录日志的用户直接过滤掉——这类用户的bb.LogDate是NULL,不满足日期区间的判断条件,左连接的效果直接失效 - 只判断
bb.Status is null,会漏掉那些在指定时间段内只有登录失败(Status=0)记录的用户,这类用户其实也符合"未成功登录"的要求
正确的查询写法
方法1:用NOT EXISTS(推荐,性能更优)
SELECT * FROM Users aa WHERE NOT EXISTS ( SELECT 1 FROM Login_Log bb WHERE aa.UserId = bb.UserId AND bb.LogDate >= DATEADD(month, -1, GETDATE()) AND bb.LogDate <= GETDATE() AND bb.Status = 1 )
直白说就是:找出所有不存在"过去1个月内成功登录记录"的用户,剩下的就是你要的——包括从来没登录过的用户,以及这段时间只登录失败的用户。
方法2:用LEFT JOIN + 筛选未匹配记录
SELECT aa.* FROM Users aa LEFT JOIN Login_Log bb ON aa.UserId = bb.UserId AND bb.LogDate >= DATEADD(month, -1, GETDATE()) AND bb.LogDate <= GETDATE() AND bb.Status = 1 WHERE bb.UserId IS NULL
这个思路是:把"过去1个月成功登录"的条件写在JOIN的ON子句里,左连接会保留所有用户,只有有成功登录记录的用户能匹配到bb表的数据;最后筛选出bb表数据为NULL的用户,就是没有成功登录记录的目标用户。
示例结果验证
假设当前日期是2022-06-01,过去1个月是2022-05-01至2022-06-01,用上面的查询会得到:User1、User2、User3——User4在2022-05-02有成功登录记录,会被排除;User1、User2最近1个月没有成功登录,User3完全没有登录日志,都符合要求。
内容的提问来源于stack exchange,提问作者DooDoo
相关产品推荐
相关产品推荐

