多个表数据无法进行合并或者进行合并后无法分页的情况下进行手动分页

该博客探讨了在数据库查询中处理分页逻辑的过程,特别是如何根据逻辑索引和每个表的总条数计算实际索引。文章通过示例解释了实际索引的计算方法,即在逻辑索引小于表的总条数时进行特殊处理,以确保正确获取所需数据。博主提供了关键代码片段来展示如何在Java中实现这一逻辑,涉及到了Mybatis-Plus的Page类和动态SQL查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 逻辑就是:根据索引数和每个表的总个数去查询,最主要的是计算每个表的实际索引

首先是根据前端传过来的pageNum和pageSize可以计算出逻辑索引,接着就是根据逻辑索引计算出实际索引的值

首先从第二个表开始,能看到一些规律,就是:实际索引=逻辑索引-(前边的所有表的所有条数(不包含自身的表)),如下表所示

表的条数逻辑索引实际索引实际索引
400
11
22
33
3404-4
515-4
626-4
6707-7
818-7
92
103
114
125
1130

但是其中会有一些特殊情况,就是逻辑索引小于表的条数的情况,比如我要查询第2页的数据,每页3个数据,那么它的逻辑索引就是3;

它查询的结果应该是第一个表的最后一个,以及第一个表的前两个数据

第一个表查完后,需要对逻辑索引进行重新计算,则逻辑索引-表的总条数则就是下一个表的实际索引;

但是目前的情况是3-4=-1,所以则是不对的,可以进行修正,就是在逻辑索引小于总条数的时候进行加一进行补正,为了更符合逻辑,在最后进行判断,如果逻辑索引小于0的情况下,则将逻辑索引修正为0;

主要逻辑代码如下:

        import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
        //    pageSize 每页个数,   pageNum 第几页     
        // 开始索引
		long[] fromIndex = new long[] { (long) pageSize };
		// 剩余个数
		long[] surplusSize = new long[] { pageSize * pageNum - pageSize };
        tableList.forEach(tableName -> {
			if (surplusSize[0] > 0) {
                //进行分页查询,需要注意的是这里使用的是索引和个数,也就是limit offset
				Page<Object> dbPageList = dbservice.selectDataByTableName(fromIndex[0], surplusSize[0],tableName);
                 //这个就是要查出来的数据,将数据保存到结果集中
				List<Object> list = data.getRecords();
				surplusSize[0] -= list.size();
				//获取本表的总条数
				long totalThis = data.getTotal();
				//如果索引大于总条数,则直接相减
				if(fromIndex[0]>=totalThis) {
				fromIndex[0]-=totalThis;
				}else {
				fromIndex[0]-=(totalThis-1);
				}
				if(fromIndex[0]<0) {
				fromIndex[0] = 0;
				}
			}
		}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值