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

SQL按Person分组取最大ID且Success=1的写法优化咨询

优化方案说明

方案1:窗口函数实现(推荐,适用于MySQL 8.0+、PostgreSQL、SQL Server等支持窗口函数的数据库)

该方案仅需扫描一次表,逻辑清晰可读性更高,代码如下:

SELECT ID, Person, Success, Message
FROM (
    SELECT *,
        ROW_NUMBER() OVER (PARTITION BY Person ORDER BY ID DESC) AS rn
    FROM test
) t
WHERE rn = 1 AND Success = 1

实现逻辑:先给每个用户的记录按ID倒序排序,rn=1对应每个用户的最新记录,直接过滤Success=1的条目即可,无需额外关联表。

方案2:兼容低版本数据库的精简写法

如果你使用的是MySQL 5.x这类不支持窗口函数的数据库,可以把你原写法里的RIGHT JOIN改成更符合逻辑的INNER JOIN(子查询返回的max_id均为原表存在的有效ID,不需要右连接匹配空值),精简后代码如下:

SELECT t1.*
FROM test t1
INNER JOIN (
    SELECT MAX(ID) max_id FROM test GROUP BY Person
) t2 ON t1.ID = t2.max_id
WHERE t1.Success = 1

该写法和你原实现的性能完全一致,但逻辑更直观易懂。

性能提示

如果表数据量较大,建议给Person字段添加索引,两种方案的查询效率都会有明显提升(ID为自增主键默认自带索引,无需额外添加)。

内容的提问来源于stack exchange,提问作者Suomax

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:21:02