MySQL查询修正:获取指定日期前登录但之后未登录的用户
解决登录日志查询逻辑错误:找出指定日期前登录但之后未登录的用户
嘿,我看了你的SQL和需求,问题出在逻辑完全写反了,咱们一步步捋清楚:
原SQL的问题分析
你的需求是找「2017-04-07前登录过,但之后没登录的用户」,但原SQL做了相反的事:
- 子查询里找的是所有在2017-04-07前登录过的用户,然后外层用
NOT IN,这就变成了筛选「从来没在2017-04-07前登录过的用户」,完全背离需求。 - 外层查询没有先过滤出「至少有一次在2017-04-07前登录」的用户,哪怕子查询改对了,结果也会包含不符合前提的用户。
修正方案(两种常用写法)
写法1:分组取用户最后登录日期(最直观)
通过分组统计每个用户的最后登录时间,只要最后登录时间早于指定日期,就满足「之前登录过、之后没登录」的条件:
SELECT user_login FROM wp_login_log_backup GROUP BY user_login HAVING MAX(date) < '2017-04-07 00:00:00';
如果需要同时统计该用户的登录次数,也可以加上计数字段:
SELECT user_login, COUNT(*) AS login_count FROM wp_login_log_backup GROUP BY user_login HAVING MAX(date) < '2017-04-07 00:00:00';
写法2:用NOT IN(贴合你的原始思路调整)
先筛选出「在2017-04-07前登录过的用户」,再排除掉「在2017-04-07及之后登录过的用户」:
SELECT DISTINCT p.user_login FROM wp_login_log_backup p WHERE p.date < '2017-04-07 00:00:00' AND p.user_login NOT IN ( SELECT u.user_login FROM wp_login_log_backup u WHERE u.date >= '2017-04-07 00:00:00' );
这里用DISTINCT是因为一个用户可能有多次早于指定日期的登录,避免结果重复。
验证结果
用你的日志数据测试,这两种写法都会返回timothybrown、robinbiundo(注:日志里abigailrashbaum的所有登录都在2016年,也符合条件,如果不需要她,可能需要额外过滤条件,但按照你的需求描述,这两个写法是符合逻辑的)。
内容的提问来源于stack exchange,提问作者Manjunath
相关产品推荐
相关产品推荐

