MySQL如何查询用户在上个月和本月是否均有登录记录
首先假设你的表名为 user_login,如果实际表名不同请自行替换。
查询语句
SELECT UserId, CASE -- 判断是否存在本月登录记录 WHEN COUNT(DISTINCT CASE WHEN DATE_FORMAT(LoginDatetime, '%Y-%m') = DATE_FORMAT(CURDATE(), '%Y-%m') THEN 1 END) > 0 -- 判断是否存在上个月登录记录 AND COUNT(DISTINCT CASE WHEN DATE_FORMAT(LoginDatetime, '%Y-%m') = DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 1 MONTH), '%Y-%m') THEN 1 END) > 0 THEN 'Yes' ELSE 'No' END AS `Logged in both months` FROM user_login -- 可选:添加过滤条件只扫描近2个月的记录,大幅提升大表查询效率 -- WHERE LoginDatetime >= DATE_SUB(CURDATE(), INTERVAL 2 MONTH) GROUP BY UserId;
逻辑说明
- 用
DATE_FORMAT(LoginDatetime, '%Y-%m')提取登录时间的年月维度,避免同一年不同月/不同年同月的判断误差 - 内层CASE语句标记对应月份的登录记录,外层COUNT统计是否存在至少1条对应月份的记录
- 两个月份都存在登录记录时返回
Yes,否则返回No GROUP BY UserId自动对用户ID去重,符合去重用户列表的要求
示例验证
你提供的示例数据里的登录记录都为2021年及更早,若当前系统时间不在2021年1-2月区间内,两个用户都不满足「近两个月都登录」的条件,输出结果和你给出的预期示例一致。
内容的提问来源于stack exchange,提问作者renan
相关产品推荐
相关产品推荐

