GROUP BY weeks; Как вывести диапазон?
Такой вариант:

SELECT
  DATE_FORMAT(`start_date`, '%x-%v') weeks,
  COUNT(*), DATE_ADD(`start_date`, INTERVAL(2-DAYOFWEEK(`start_date`)) DAY) first_date,
    DATE_ADD(`start_date`, INTERVAL(8-DAYOFWEEK(`start_date`)) DAY) last_date
FROM `events` GROUP BY weeks;

Группируете со строкам — имхо медленновато будет.
Если в локалке, я бы прохронометрировал так: формировать строку недели, числовой номер недели, счётчик; группировал бы по числовому номеру недели, в приложении отбирал бы две колонки.
Если нагрузка на сеть будет из-за числового номера недели слишком большой, оставил бы как у вас, разве что формат строки поменял бы на необходимый вам.