1. 云栖社区>
  2. PHP教程>
  3. 正文

多表合成一张虚拟表,分页输出

作者:用户 来源:互联网 时间:2017-12-01 14:35:07

虚拟输出合成

多表合成一张虚拟表,分页输出 - 摘要: 本文讲的是多表合成一张虚拟表,分页输出, 有些时候,数据不止存在一张表中,可能有多个表,但是需要一并分页输出。这个时候就需要逻辑处理下。 一表“拆成”多表优缺点: 优点:减少了数据库冗余,更轻量;灵活性高 缺点:查询复杂;数据只能批量输出。(A表分页完后,B表才开始输出。) 多表


有些时候,数据不止存在一张表中,可能有多个表,但是需要一并分页输出。这个时候就需要逻辑处理下。

一表“拆成”多表优缺点:

优点:减少了数据库冗余,更轻量;灵活性高

缺点:查询复杂;数据只能批量输出。(A表分页完后,B表才开始输出。)

多表合一的图示:


多表合成一张虚拟表,分页输出-

思路:把多个表虚拟的合成一张表,然后计算出初始偏移量。

比如:A表有7条数据,现在要计算的页码数是2,每页10条。

那么偏移总量就是:1×10 = 10

由于 10 > 7,那么开始的偏移位置可能是在B。

如果B的数据是8条,由于 10 < 7 + 8 ,确实开始的偏移位置是在B,

而且开始偏移是 10 - 7 = 3,

开始筛选B表的数据 select * from B limit 3, 10

结果是 5 条,由于 5条小于需要的总条数,那么需要再去C表拿数据。

这个时候要注意:C表的偏移量是从0开始的,不需要再进行加减计算

(同理,可以想象第0条是从A表的前面一个表拿到的,于是第一页的数据是完全从A表拿,所以偏移位置和这里的C一样,是0,这样整个逻辑就变成一体的了)

具体的代码实现:

//表1 表2 表3 连表输出

$len1 + $len2 + $len3

//可以剥离 $com_sql 便于复用查询 总条数 和 具体结果

$total_len = $len1 + $len2 + $len3;

$next_allow = false;//是否能执行下一步

$next_step = '';

$result = '';//结果集

if($offset > $len1){

$offset -= $len1;//直接 -= 去运算,下一个阶段可以复用

if($offset > $len2){

//省略一步,没有数据,直接返回

return json_encode(['total'=>0, 'rows'=>'']);

}else{

$next_step = 'x2';

}

}else{

$next_step = 'x1';

}

if($next_step == 'x1'){

$result = M()->offset->limit;//第一部可以用result

$limit -= count($result);

if($limit){

$offset = 0;//除了第一阶段需要 $offset 到了下一个阶段都是从0开始

$next_allow = true;

}

}

if($next_step == 'x2' || $next_allow){

$tmp = M()->offset->limit;

//合并$tmp 到 $result

$limit -= count($tmp);//是$tmp 而不是$result

if($limit){

$offset = 0;

$next_step = true;

}

}

if($next_step == 'x3' || $next_allow){

$result = M()->offset->limit;

//合并$tmp 到 $result

}




以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索虚拟 , 输出 合成 ,以便于您获取更多的相关知识。