在某些字段更改之前查找连续索引

时间:2017-06-19 18:31:08

标签: mysql sql algorithm

我在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中执行此操作?或者,除了暴力之外,还有一种有效的算法来实现这一目标吗?查询返回后,可以进行一些后期处理。

1 个答案:

答案 0 :(得分: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;

这是一个工作版本。