数据准备

  t_order_1 :[1,3,5,7,9,11,13,15,17,19]

  t_order_2 :  [2,4,6,8,10,12,14,16,18,20]

1.查询目标

  分页查询第二页,每页5条,所以我们想得到的数据是[6,7,8,9,10]

2.具体操作  

  原先的SQL的offset=5,称之为全局offset,这里由于是拆分成了两张表,因此改写后的offset=全局offset/2=5/2=2,得到如下两条sql.

  select num from t_order_1 order by num asc limit 2,5;
  select num from t_order_2 order by num asc limit 2,5;

  结果 [5,7,9,11,13] 和 [6,8,10,12,14]

  t_order_1:5条数据中最小值为:5

  t_order_2:5条数据中最小值为:6

  那么两张表中的最小值为5,记为min,来自t_order_1这张表。这个过程只需要比较各个分库第一条数据,时间复杂度很低。

  t_order_1这张表,第一次查询时的最大值为13

  select num from t_order_1 where num BETWEEN min and 13;

  t_order_2这张表,第一次查询时的最大值为14

  select num from t_order_2 where num BETWEEN 5 and 14;

  结果为: [5,7,9,11,13] 和 [6,8,10,12,14] (结果一样是因为例子中表数据规则)

  最小值5,在表1和表2中的偏移量都为2,两张表就是 2*2 = 4,所以结果为

  select * from (
  select num from t_order_1 where num BETWEEN 5 and 13 UNION
  select num from t_order_2 where num BETWEEN 5 and 14 ) A ORDER BY num LIMIT 1,5   再向后移一位。

  结果为 [6,7,8,9,10] 

  ———————————–分割线——————————————–

  如果查第三页,sql 为

  select num from t_order_1 order by num asc limit 4,5;
  select num from t_order_2 order by num asc limit 4,5;

  结果为: [9,11,13,13,15] 和 [10,12,14,16,18]

  select * from (
  select num from t_order_1 where num BETWEEN 9 and 17 UNION
  select num from t_order_2 where num BETWEEN 9 and 18 ) A ORDER BY num LIMIT 2,5;

  最终结果为 [11,12,13,14,15]

  ———————————–分割线——————————————–

  如果查第 N 页,

  select num from t_order_1 order by num asc limit 2*(N-1),5;
  select num from t_order_2 order by num asc limit 2*(N-1),5;

  select * from (
  select num from t_order_1 where num BETWEEN min and max1 UNION
  select num from t_order_2 where num BETWEEN min and max2 ) A ORDER BY num LIMIT 1*(N-1),5;

  1*(N-1) 中,第一个 1 = 5%2

  ———————————–分割线——————————————–

  如果有3张分表,查第2页,每页10条,

  offSet = 10 / 3 = 3 ;  offSet2 = 10%3 = 1

  select num from t_order_1 order by num asc limit 3 * (2-1),10;
  select num from t_order_2 order by num asc limit 3 * (2-1),10;

  select num from t_order_2 order by num asc limit 3 * (2-1),10;

  select * from (
  select num from t_order_1 where num BETWEEN min and max1 UNION
  select num from t_order_2 where num BETWEEN min and max2 UNION

  select num from t_order_3 where num BETWEEN min and max3 ) A ORDER BY num LIMIT offSet2*(2-1),10;

 

 

  

原文地址:http://www.cnblogs.com/fengyuduke/p/16924353.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性