ITPub博客

首页 > 数据库 > MySQL > MySQL 缺失范围问题

MySQL 缺失范围问题

翻译 MySQL 作者:神谕丶 时间:2014-08-21 16:46:11 0 删除 编辑
 本例子运用的是range_problem中的表和数据 

  1. create table range_problem(
  2.     a int(10) unsigned not null,
  3.     primary key (a));


  1. insert into range_problem values(1);
  2. insert into range_problem values(2);
  3. insert into range_problem values(3);
  4. insert into range_problem values(48);
  5. insert into range_problem values(50);
  6. insert into range_problem values(51);
  7. insert into range_problem values(52);
  8. insert into range_problem values(53);
  9. insert into range_problem values(66);
  10. insert into range_problem values(67);

最终要得到的缺失范围为:





方案一及解决思路:
1、找出start_range该间断点之前的值,然后把该值+1,即为start_range
2、通过间断点找出下一个值,对该值-1,即为end_range

1、对于间断点之前的值:


  1. select a
  2. from range_problem a
  3. where not exists (select *
  4.                 from range_problem b
  5.                 where a.a+1 = b.a)
  6. and
  7. a < (select max(a)
  8.      from range_problem);
得出:


若不在父查询中加上and条件,则a列的最大值67将不会排除在外,此处67被筛选出来无意义。

2、在上面的基础上,再通过子查询处理end_range:


  1. select a+1 as start_range,
  2.         (select min(a)-1
  3.         from range_problem c
  4.         where c.a > a.a) as end_range
  5. from range_problem as a
  6. where not exists (select *
  7.                 from range_problem b
  8.                 where a.a+1 = b.a)
  9. and
  10. a < (select max(a)
  11.      from range_problem);

这将得出我们想要的缺失范围。


方案二及解决思路:
将range_problem中的数据进行位移匹配,如果是连续的值,那么其差值应该在1,反之大于1:


  1. select a cur,
  2.         (select min(a)
  3.         from range_problem b
  4.         where b.a>a.a) next
  5. from range_problem a


得出:



根据结果我们可以知道,next-cur=1时,值为连续的,不连续的值为(3,48),(48,50),(53,66)
而我们要求的是(4,47),(49,49),(54,65),即(cur+1,next-1)

在上面的基础上,再加以修改:


  1. select cur+1 start_range,next-1 end_range
  2. from(select a cur,
  3.             (select min(a)
  4.             from range_problem b
  5.             where b.a > a.a) next
  6.     from range_problem a) c
  7. where next-cur>1;
这将得出我们想要的缺失范围。

最后:
此处演示的是缺失范围是整型类型。在生产环境中遇到的类型可能是整型,也可能是时间类型,两者并非有多大的区别,稍作修改就可以将该例子转换为时间类型。





来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29773961/viewspace-1255445/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
微信公众号:神谕的暗影长廊

注册时间:2014-07-28

  • 博文量
    161
  • 访问量
    1195299