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
相关产品推荐
相关产品推荐

