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

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

  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 就不要用分页,然后只在数组这里用分页,但是如果三张表的数据量非常非常大,那肯定也不行。

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

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 29
Mutoulee

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

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

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

1年前 评论
andyzu (楼主) 1年前
MArtian 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年前 评论

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