MySQL range問題

神諭丶發表於2014-08-10

首先建立這樣一個表
  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. select a,@a:=@a+1 as b
  2. from range_problem,(select @:a=0) as a;
其中b為認為計算出來的行號,通過@a:=@a+1來累加



再做另一個返回集:(通過返回的結果來看,發現一組連續值內,連續數值的差是一個常量





解決方案:

  1. select a,b,a-b as diff
  2. from(
  3.     select a,@a:=@a+1 b
  4.     from range_problem,
  5.         (select @a:=0) as a
  6.     ) as b;






由於a-b為固定值,我們可以將通過為其分組,來實現最後的範圍


  1. select min(a) start_range, max(b) end_range
  2. from(select a,b,a-b as diff
  3.     from(select a,@a:=@a+1 as b
  4.         from range_problem,(select @a:=0) as a
  5.         ) as b
  6.     ) as c
  7. group by diff;





方案二及解決思路:(通過子查詢)

我們手動get到一個列,並對這個列進行分組,這個咧應該是每個連續分組的最大值。
比如1~3的範圍,最大值應該是3。
方法是,大於或等於當範圍值,且最後一個值為間斷的最小值。


  1. select a,(
  2.         select min(a)
  3.         from range_problem a
  4.         where not exists (select *
  5.                         from range_problem b
  6.                         where a.a+1 = b.a)
  7.         and a.a >= c.a) max
  8. from range_problem c;



最後只需要再將max列分組,然後獲得最大值和最小值就是我們要的結果了:


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

但此解決方案的掃描成本變為O(N^2),對於表中資料量很大的情況,其效能則會變得十分糟糕。




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29773961/viewspace-1248574/,如需轉載,請註明出處,否則將追究法律責任。

相關文章