Самый простой метод использует lag()
, чтобы получить предыдущее значение даты.Это недоступно в большинстве версий MySQL.Коррелированный подзапрос действительно больно делать работу.Последний параметр - это переменные:
select min(id) as mainid, min(date), max(date),
group_concat(id order by id) as ids
from (select t.*,
(@grp := if(@prev_date > date - interval 36 second,
if(@prev_date := date, @grp, @grp), -- keep the group the same
if(@prev_date := date, @grp + 1, @grp + 1)
)
) as grp
from (select t.*
from t
order by date
) t cross join
(select @prev_date := '', @grp := 0) params
) t
group by grp;
РЕДАКТИРОВАТЬ:
Вы можете удалить основной идентификатор, выполнив:
select min(id) as mainid, min(date), max(date),
substr(group_concat(id order by id), length(min(id)) + 1) as ids