Вам нужен способ генерации всех дат.Стандартный ответ - использовать left join
и таблицу календаря или другую таблицу с желаемыми датами.
В вашем случае в вашей таблице уже могут быть все даты.Если это так, самый простой метод - это условное агрегирование:
select date(start_date) as dates,
sum(segment_id = 30) cnt_30
from campaigns
where start_date >= date_sub(curdate(), interval 7 day) and
start_date < date_add(curdate(), interval 1 day)
group by date(start_date);
Вы заметите, что я также изменил предложение where
, удалив вызовы функций для start_date
.Это позволяет оптимизатору MySQL использовать индекс, если он есть.