关于多表组合数据再进行分页的问题
我现在有一个这样的需求:
- 前言:接口需要从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();
- 需求:需要对数据进行分页。目前的方式是:已经在读取三张表里的SQL加了分页。但是组到一起肯定大于10条了(产品要求10条分一页)。然后:
$offset = ($page - 1) * 10; $data = array_slice($dataSet, $offset, 10);
- 结果:用这样的形式,发现数据总量不够。打印出来的总条数,和数据库里的总条数对不上。
- 怀疑:会不会是因为SQL 里加了分页,用对数组加了分页,所以数据有问题?
- 延展:那是不是应该从 A、B、C 三张表读数据的SQL 就不要用分页,然后只在数组这里用分页,但是如果三张表的数据量非常非常大,那肯定也不行。
问题:请大神给出解决思路。
ABC三个表结构一样? 我猜不是! 首先想到的就是跟产品沟通需求,改进需求; 如果非得坚持要三个不同结构的表还要翻页,那注定SQL里不能用分页了,只能在给前端输出时候做分块了。
三张表是关联的?还是没啥关系?
可以加一张表D,字段type表示关联的表,字段relation_id表示关联表的id。分页查询的时候查表D,详细数据关联查询表A、B、C即可。
为什么你每个表要取 10 条然后再分页?为什么不能 A B C 3 个表一个总共取 10 条?反正你的数据也是 3 张表混合的
把三个表的数据整理一下,都跑到 ES 或者 MongoDB 一个索引(集合),然后去 ES 或者 MongoDB 分页查。
MySQL 自身也可以,无非就是做冗余。
是这个吗?我之前遇到过物流表分两张,然后需要合并查询,根据时间维度排序。mysql 两张不同的表连表查,合并,并分页 UNION ALL的使用
我觉得可以考虑在三表基础上建立一个多态主表,但是这样的话子表增删改的时候就需要维护好这个主表了
意思我是这样子?
建议使用数据库视图,将三张表整合在一起进行查询分页
三个表做成一个视图,然后你懂的
本笨蛋想到了个笨方法: