基于时间优先级获取用户特定状态A的MySQL查询需求
用户状态记录筛选解决方案
需求说明
仅返回满足以下条件的状态A记录:该记录的更新时间是对应用户所有状态(A、B、C、D)中的最晚时间;若用户存在更新时间晚于状态A的其他状态,则不返回该用户的任何记录。
原查询的问题
你提供的原查询逻辑完全不符合需求:
SELECT t1.* FROM table t1 INNER JOIN table t2 on t2.status=t1.status where t1.status='A' and t1.updated > t2.updated
- 关联条件
t2.status=t1.status仅对比了同状态(均为A)的记录,完全未涉及B、C、D状态的更新时间 - 最终查询结果是同一用户下更新时间晚于其他A状态的记录,和“晚于所有其他状态”的核心需求无关
正确实现方案
方案1:兼容全版本MySQL的子查询写法
先统计每个用户的最新更新时间,再筛选出状态为A且更新时间匹配该用户最新时间的记录:
SELECT us.* FROM user_status us INNER JOIN ( SELECT user_id, MAX(updated) AS latest_updated FROM user_status GROUP BY user_id ) AS user_latest ON us.user_id = user_latest.user_id WHERE us.status = 'A' AND us.updated = user_latest.latest_updated;
方案2:MySQL 8.0+ 窗口函数写法
利用窗口函数按用户分组、更新时间倒序排序,直接取每个用户的最新状态,再筛选状态为A的记录:
SELECT id, user_id, status, updated FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY updated DESC) AS rn FROM user_status ) AS ranked WHERE rn = 1 AND status = 'A';
示例数据验证
针对给出的示例数据:
- 用户1的最新更新时间为
2023-12-28 23:36:06,对应状态A,符合条件,返回id=3的记录 - 用户2的最新更新时间为
2023-12-27 23:22:06,对应状态C,状态A的更新时间更早,因此无记录返回
内容的提问来源于stack exchange,提问作者MSP
相关产品推荐
相关产品推荐

