我在一个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中有这样做的方法吗?或者,是否有一个有效的算法来实现这一点,而不是暴力?查询返回后可能会进行一些后期处理。

最佳答案

可以在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;

这是一个工作版本。

10-06 05:05