You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于时间优先级获取用户特定状态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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 14:38:10