关于多表组合数据再进行分页的问题

我现在有一个这样的需求:

  1. 前言:接口需要从A、B、C三张表读取数据,这三张表的数据有可能有很多(超过10条), 也有可能没有数据。然后我需要把这三个表的数据组成一个数组,转成json给前端,前端在设备上显示。
// 贴一个SQL ,其他两个类似。
$offset = ($page - 1) * 10;
        $res = DB::table('goods')
            ->orderByDesc('created_at')
            ->where('parent_id', '=', $resource_type)
            ->whereNull('deleted_at')
            ->offset($offset)->limit(10)
            ->get();
  1. 需求:需要对数据进行分页。目前的方式是:已经在读取三张表里的SQL加了分页。但是组到一起肯定大于10条了(产品要求10条分一页)。然后:
    $offset = ($page - 1) * 10;
    $data = array_slice($dataSet, $offset, 10);
  2. 结果:用这样的形式,发现数据总量不够。打印出来的总条数,和数据库里的总条数对不上。
  3. 怀疑:会不会是因为SQL 里加了分页,用对数组加了分页,所以数据有问题?
  4. 延展:那是不是应该从 A、B、C 三张表读数据的SQL 就不要用分页,然后只在数组这里用分页,但是如果三张表的数据量非常非常大,那肯定也不行。

问题:请大神给出解决思路。

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 29

ABC三个表结构一样? 我猜不是! 首先想到的就是跟产品沟通需求,改进需求; 如果非得坚持要三个不同结构的表还要翻页,那注定SQL里不能用分页了,只能在给前端输出时候做分块了。

1个月前 评论
andyzu (楼主) 1个月前
抄你码科技有限公司 1个月前
andyzu (楼主) 1个月前
抄你码科技有限公司 1个月前
Mutoulee (作者) 1个月前
andyzu (楼主) 1个月前
Mutoulee (作者) 1个月前
andyzu (楼主) 1个月前

三张表是关联的?还是没啥关系?

1个月前 评论
andyzu (楼主) 1个月前
MArtian 1个月前
andyzu (楼主) 1个月前

首先明确10条是总数10条还是 一个表10条:如果是一个表10页的话就没个表都用page size 如果是总数10的话 那么就要考虑到 10/3 的情况了 总的来说分页只是小问题,没有解决不了

1个月前 评论
andyzu (楼主) 1个月前

可以加一张表D,字段type表示关联的表,字段relation_id表示关联表的id。分页查询的时候查表D,详细数据关联查询表A、B、C即可。

1个月前 评论
andyzu (楼主) 1个月前

为什么你每个表要取 10 条然后再分页?为什么不能 A B C 3 个表一个总共取 10 条?反正你的数据也是 3 张表混合的

1个月前 评论
andyzu (楼主) 1个月前

把三个表的数据整理一下,都跑到 ES 或者 MongoDB 一个索引(集合),然后去 ES 或者 MongoDB 分页查。

MySQL 自身也可以,无非就是做冗余。

1个月前 评论
andyzu (楼主) 1个月前

是这个吗?我之前遇到过物流表分两张,然后需要合并查询,根据时间维度排序。mysql 两张不同的表连表查,合并,并分页 UNION ALL的使用

1个月前 评论
andyzu (楼主) 1个月前

我觉得可以考虑在三表基础上建立一个多态主表,但是这样的话子表增删改的时候就需要维护好这个主表了

1个月前 评论
chowjiawei

file

file

file

意思我是这样子?

1个月前 评论
chowjiawei (作者) 1个月前

建议使用数据库视图,将三张表整合在一起进行查询分页

1个月前 评论

三个表做成一个视图,然后你懂的

1个月前 评论

本笨蛋想到了个笨方法:

        $tables=[
            ['sql'=>'...','offset'=>0],
            ['sql'=>'...','offset'=>0],
            ['sql'=>'...','offset'=>0],
        ];
        $list=[];
        $size=10;
        do{
            $table=array_shift($tables);
            $res=DB::select($table['sql']." offset ".$table['offset']);
            if($res){
                $list[]=$res[0];
                if(count($list)===$size){
                    break;
                }
                $table['offset']++;
                $tables[] = $table;
            }
        }while(count($tables)>0);
        print_r($list);
1个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!