2025-01-31
实战设计
0

目录

需求内容
具体实现
逻辑实现
代码实现
总结

从一个表中获取同字段type的最新一条数据,然后将获取的数据进行分页展示

需求内容

同一个单据中会有多个批次,在推送记录中展示出所有推送批次中最新的一条,如果推送失败,则展示推送的异常原因与推送按钮,推送成功则表示终态,不可在操作。

设计的过程中,需要将历史的推送记录都有留痕,而不是每次推送直接覆盖

具体实现

逻辑实现

使用 Mybatis Plus 进行开发,为了查询效率,具体实现逻辑为

  • relationIdtype 创建聚合索引
  • 子查询中查询同一个单据下所有推送记录 where relationId = ? and type = ?
  • 然后根据推送类型与推送批次 group by push_order_type ,push_batch_no 进行分组
  • max(id) 为最新一条,如果时间字段区分度高也可以使用时间字段,或者就用当前自增ID
  • 在 in 查询出来的最新id即可

以上子查询中的查询效率会直接命中索引,也就是达到 覆盖索引

覆盖索引

如果一个索引包含(或者说覆盖)所有需要查询的字段的值,我们称之为覆盖索引 , 如果索引的叶子节点中已经包含要查询的数据,那么没什么必要再回表查询了

代码实现

java
// 构建参数 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语句为

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;

总结

工作过程中,经常会遇到一些特殊场景,其中涉及一些复杂且通用的代码逻辑,在此进行记录,下次有此需求时直接套用即可。

本文作者:柳始恭

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!