# 多数据源分页查询拼接订单

在工作的项目中遇到了一个问题，

描述：订单列表中原本是单库单表存储订单历史，因为有对接第三方服务，所以出现了多数据的查询，需要整合到同一列表中，并根据时间倒序进行排序，分页展示，每页展示十条数据

思路：

因考虑数据量可能太大，整合成新表进行查询不太现实，经过以下几步思考结果

1。从两个数据库各获取五条订单，按时间顺序进行排序展示。

查询sql语句：

第一页：SELECT \* FROM table\_order ORDER BY date DESC OFFSET 0 LIMIT 5

拼接多个数据库的列表并排序后展示。

第二页：SELECT \* FROM table\_order ORDER BY date DESC OFFSET 5 LIMIT 5

拼接多个数据库的列表并排序后展示。

第N页：SELECT \* FROM table\_order ORDER BY date DESC OFFSET 5\*(N-1) LIMIT 5

拼接多个数据库的列表并排序后展示。

缺点：订单列表非常乱，可读性巨差，两个服务的数量差距也比较大。（按两边大概比例拉取同样被否决）

2。每个数据库取10条数据缓存到内存中进行排序，提取前10条展示；第二页时各缓存20条，排序后取前20条展示；第N页各数据库缓存N\*10条数据，排序后展示前N\*10条。

查询sql语句：

第一页：SELECT \* FROM table\_order ORDER BY date DESC LIMIT 10

拼接多个数据库的列表并排序后展示列表中前10条

第二页：SELECT \* FROM table\_order ORDER BY date DESC LIMIT 20

拼接多个数据库的列表并排序后展示列表中第11\~20条

第N页：SELECT \* FROM table\_order ORDER BY date DESC LIMIT 10\*N

拼接多个数据库的列表并排序后展示列表中第10\*N-9\~10\*N条

此方案中，能够得到业务所需要的准确数据，而不会产生乱序的情况，但是性能会差很多，并且往后翻页性能会急剧下降。服务端进行排序的数据量也比较大，对服务器的压力会有较大。

3。改进想法

（1）第一页在数据库中各取前十条，拼接列表后排序并展示前十数据。并保存最后一条记录的时间theLastDate

（2）第二页根据theLastDate进行查找，每个数据库各取十条，进行拼接后排序并把前十条数据添加进列表中，并更新最后一条记录的时间theLastDate

（3）第N页根据第N-1页的theLastDate进行查找，每个数据库各取十条，进行拼接后排序并把前十条数据添加进列表中，并更新最后一条记录的时间theLastDate

sql查询语句：

第一页：SELECT \* FROM table\_order ORDER BY date DESC LIMIT 10

拼接多个数据库的列表并排序后展示列表中前10条，并记录最后一条记录的时间

第二页：SELECT \* FROM table\_order ORDER BY date DESC WHERE date\<theLastDate LIMIT 10

拼接多个数据库的列表并排序，把列表中前10条添加进订单列表中，并更新最后一条的时间

第一页：SELECT \* FROM table\_order ORDER BY date DESC WHERE date\<theLastDate LIMIT 10

拼接多个数据库的列表并排序，把列表中前10条添加进订单列表中，并更新最后一条的时间

此方案中，可以精准的取出所需的数据，并不会产生乱序的列表；性能也比较稳定，不会因为列表的增多而使加载时间过长，但是无法跳页展示，必须是邻页跳转，跟产品经理沟通后决定改变展现方式。并不会产生太多影响。

至此， 其实问题已经基本解决，改变后的列表为上滑加载下一页内容直接拼接在列表后面，并不会出现跳页的情况。

但是，晚上回家又想了一些。

最终产生了结合2和3的方案，有再更新了一个想法：

（1）第一页在数据库中各取前十条，拼接列表后排序并展示前十数据。并保存最后一条记录的时间theLastDate

（2）页数展示时可以点击当前页的附近几页和首尾几页，中间省略\~

当选择首尾几页的内容时，通过ORDER BY和LIMIT来取值，并进行排序后选取合适的数据进行展示；

当选择当前页的附近几页时，通过当前页的最值来加WHERE条件，ORDER BY和LIMIT组合取值后，进行排序并选取合适的数据进行展示。

此方法可以保证列表的精准性，并允许了简单的跳页功能，暂时来说是我自己想到最好的办法了。
