数据库 - 如何获取分组中同类型数据最新的一条
约 515 字大约 2 分钟
2026-05-25
从一个表中获取同字段type的最新一条数据,然后将获取的数据进行分页展示
需求内容
同一个单据中会有多个批次,在推送记录中展示出所有推送批次中最新的一条,如果推送失败,则展示推送的异常原因与推送按钮,推送成功则表示终态,不可在操作。
设计的过程中,需要将历史的推送记录都有留痕,而不是每次推送直接覆盖
具体实现
逻辑实现
使用 Mybatis Plus 进行开发,为了查询效率,具体实现逻辑为
- 将
relationId与type创建聚合索引 - 子查询中查询同一个单据下所有推送记录
where relationId = ? and type = ? - 然后根据推送类型与推送批次
group by push_order_type ,push_batch_no进行分组 - max(id) 为最新一条,如果时间字段区分度高也可以使用时间字段,或者就用当前自增ID
- 在 in 查询出来的最新id即可
以上子查询中的查询效率会直接命中索引,也就是达到 覆盖索引
::: tip覆盖索引 如果一个索引包含(或者说覆盖)所有需要查询的字段的值,我们称之为覆盖索引 , 如果索引的叶子节点中已经包含要查询的数据,那么没什么必要再回表查询了 :::
代码实现
// 构建参数
LambdaQueryWrapper<TableEntity> lambdaQueryWrapper = Wrappers.lambdaQuery(TableEntity.class)
.last("id in (select max(id) from table_name where relation_id = " + req.getRelationId() + " and type = " + req.getType() + " group by push_order_type ,push_batch_no)")
.orderByDesc(TableEntity::getId);以上解析的sql语句为
SELECT
*
FROM
table_name
WHERE id in (
select max(id) from table_name where relation_id = 42 and type = 1 group by push_order_type, push_batch_no
)
ORDER BY id DESC;总结
工作过程中,经常会遇到一些特殊场景,其中涉及一些复杂且通用的代码逻辑,在此进行记录,下次有此需求时直接套用即可。