如何使用MySQL的SQL语句查询特定用户是否每日登录?
如何查询特定用户是否每日登录MySQL
针对你的需求,我整理了两种常见场景的SQL写法,你可以根据实际情况选择:
场景1:检查用户是否在所有有登录记录的日期都登录了
这个场景是看该用户是否在其他任何用户登录过的每一天都有登录记录,用CTE(公共表表达式)拆分逻辑会更清晰:
WITH all_unique_dates AS ( -- 提取所有用户的唯一登录日期(只保留日期部分,忽略具体时间) SELECT DISTINCT DATE(login_date) AS login_day FROM your_login_table -- 替换成你的实际表名 ), user_login_dates AS ( -- 提取目标用户的唯一登录日期 SELECT DISTINCT DATE(login_date) AS login_day FROM your_login_table WHERE user_id = 20703 -- 替换成你要查询的用户ID ) -- 对比总日期数和用户登录日期数,判断是否每日登录 SELECT CASE WHEN (SELECT COUNT(*) FROM all_unique_dates) = (SELECT COUNT(*) FROM user_login_dates) THEN '✅ 该用户在所有有登录记录的日期都登录了' ELSE '❌ 该用户存在未登录的日期' END AS login_check_result;
场景2:检查用户在指定时间段内是否每日登录
如果你想限定一个时间范围(比如2016-03-01到2016-03-02),可以用递归CTE生成这个区间的所有日期,再和用户的登录记录对比,还能直接找出未登录的日期:
WITH RECURSIVE date_range AS ( -- 生成指定起始到结束的连续日期 SELECT '2016-03-01' AS login_day UNION ALL SELECT DATE_ADD(login_day, INTERVAL 1 DAY) FROM date_range WHERE login_day < '2016-03-02' -- 结束日期 ), user_target_dates AS ( -- 提取目标用户在该时间段内的唯一登录日期 SELECT DISTINCT DATE(login_date) AS login_day FROM your_login_table WHERE user_id = 20703 AND DATE(login_date) BETWEEN '2016-03-01' AND '2016-03-02' ) -- 左连接后检查是否有缺失日期 SELECT CASE WHEN COUNT(dr.login_day) = COUNT(utd.login_day) THEN '✅ 该用户在指定时间段内每日都登录了' ELSE '❌ 该用户在指定时间段内存在未登录的日期' END AS login_status, -- 列出所有未登录的日期(如果有的话) IFNULL(GROUP_CONCAT(CASE WHEN utd.login_day IS NULL THEN dr.login_day END SEPARATOR ', '), '无') AS missing_login_days FROM date_range dr LEFT JOIN user_target_dates utd ON dr.login_day = utd.login_day;
小提示
- 记得把
your_login_table替换成你实际的表名,user_id = 20703替换成要查询的用户ID DATE(login_date)用来把datetime类型的登录时间转换为纯日期,避免同一天内多次登录被重复统计- 递归CTE需要MySQL 8.0及以上版本支持,如果是低版本,可以用数字序列表来生成日期范围
内容的提问来源于stack exchange,提问作者toy
相关产品推荐
相关产品推荐

