2017-06-19 48 views
1

我在MySQL服務器中有一些索引號從0到15的數據,以及另外兩個包含名稱和地址的字段。查找連續索引,直到某些字段發生變化

Name Address Index 
----- ------- -- 
Test 0x0100 0 
Test 0x0100 1 
Test 0x0100 2 
Test 0x0100 3 
Test 0x0100 4 
Test2 0x0100 5 
Test2 0x0100 6 
Test2 0x0100 7 
Test 0x0100 8 
Test 0x0100 9 
Test 0x0100 10 
Test3 0x0100 11 
Test3 0x0100 12 
Test 0x0100 13 
Test 0x0100 14 
Test 0x0100 15 

數據根據地址碼排序,然後索引。

我想,當每個索引,像下面的總結與指數的範圍這樣的數據:

Name Address Start End 
----- ------- ----- ---- 
Test 0x0100 0  4 
Test2 0x0100 5  7 
Test 0x0100 8  10 
Test3 0x0100 11  12 
Test 0x0100 13  15 

有沒有辦法在MySQL做到這一點?或者,有沒有一種有效的算法來完成這一點,而不是蠻力?查詢返回後可能會有一些後處理。

回答

2

你可以在MySQL做到這一點,使用變量:

select name, address, min(index) as start_index, max(index) as end_index 
from (select t.*, 
      (@grp := if(@name = name, @grp, 
         if(@name := name, @grp + 1, @grp + 1) 
         ) 
      ) as grp 
     from t cross join 
      (select @grp := 0, @name := '') params 
     order by index 
    ) t 
group by name, address, grp; 

這裏是一個工作版本。

+0

't'是原始記錄來自哪個表?我知道我們在這裏使用派生表,但我似乎沒有得到正確的輸出 – anthozep

+0

@anthozep。 。 。 't'是原表。 –

+0

好的,謝謝!我不知道我得到了正確的結果:http://rextester.com/BYV90313「測試」應該分成三組,如我的原始問題。感謝您一直以來的幫助! – anthozep