如何在MySQL中获取每个rate对应的最后更新记录?
解决方案:查询每个rate对应的最后一条更新记录
没问题,针对你要查询每个rate对应最后一条更新记录的需求,我给你整理了几种实用的MySQL解决方案,适配不同版本的MySQL:
首先先还原你的数据表结构和数据(注意update是MySQL关键字,所以需要用反引号包裹):
CREATE TABLE your_table ( record INT, rate INT, `update` INT ); INSERT INTO your_table VALUES (1, 1, 1), (2, 1, 2), (3, 1, 3), (4, 1, 4), (5, 2, 1), (6, 2, 2), (7, 3, 1), (8, 3, 2), (9, 3, 3);
方法1:子查询关联(兼容所有MySQL版本)
这是兼容性最好的方案,不管你用的是哪个版本的MySQL都能正常运行:
SELECT t.* FROM your_table t INNER JOIN ( -- 先获取每个rate对应的最大update值 SELECT rate, MAX(`update`) AS max_update FROM your_table GROUP BY rate ) AS t_max ON t.rate = t_max.rate AND t.`update` = t_max.max_update;
原理:先通过子查询统计出每个rate的最大更新值,再和原表关联匹配,就能拿到对应的完整记录。
方法2:窗口函数(MySQL 8.0+ 推荐使用)
如果你的MySQL版本是8.0及以上,窗口函数的写法会更简洁直观:
SELECT record, rate, `update` FROM ( SELECT *, -- 按rate分组,每组内按update降序排序,给每条记录编号 ROW_NUMBER() OVER (PARTITION BY rate ORDER BY `update` DESC) AS rn FROM your_table ) AS t WHERE rn = 1;
- 说明:
ROW_NUMBER()会给每个rate组内的记录按update从大到小编号,取编号为1的就是该rate的最后一条更新记录。 - 扩展:如果同一个rate存在多条
update值相同的“最后记录”,想要全部保留的话,可以把ROW_NUMBER()换成RANK()或者DENSE_RANK()。
方法3:GROUP BY 聚合(仅适用于record与update同步递增的场景)
如果你的数据表中record和update是同步递增的(像你给出的示例数据这样),也可以用GROUP BY直接聚合,但这个方法有局限性,仅当record和update的递增逻辑完全一致时才准确:
SELECT MAX(record) AS record, rate, MAX(`update`) AS `update` FROM your_table GROUP BY rate;
执行以上任意一种查询,都能得到你想要的结果:
record | rate | update -------|------|------- 4 | 1 | 4 6 | 2 | 2 9 | 3 | 3
内容的提问来源于stack exchange,提问作者Israel
相关产品推荐
相关产品推荐

