Хорошо, я думаю, мне удалось это решить.Предполагая, что ни один из диапазонов не перекрывается, я думаю, что это работает:
SET @group = 1, @current:= 0;
SELECT city,district,MIN(start_num),MAX(end_num) FROM (
SELECT
*,
IF((start_num-@current)=1,(@group),(@group:=@group+1)) AS contiguent_group,
@current:=end_num
FROM `testtable`) AS contiguous
GROUP BY city,district,contiguent_group
Это должно даже работать, если у вас есть две отдельные смежные группы в одной комбинации города / района.