Диапазон дат - последние семь дней. в настоящее время я получаю эти данные из этого запроса
counts dates
1 2018-12-25
1 2018-12-26
3 2018-12-30
запрос
select COALESCE(Count(campaign_id), 0) as counts,date(start_date) as dates from campaigns where segment_id=30
and date(start_date) BETWEEN DATE_SUB(CURDATE(),INTERVAL 7 DAY) AND CURDATE()
group by date(start_date)
но я хочу, чтобы ожидаемый результат был
counts dates
0 2018-12-24
1 2018-12-25
1 2018-12-26
0 2018-12-27
0 2018-12-28
0 2018-12-29
3 2018-12-30
Спасибо, мне удалось решить проблему на уровне приложения






Вам нужен способ создания всех дат. Стандартный ответ - использовать 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 использовать индекс, если он доступен.
Вы можете сгенерировать 7 строк с помощью представлений information_schema, таких как information_schema.tables
select (select count(*)
from campaigns
where start_date = e.dates
) count,
e.dates
from
(
select *
from campaigns c
right join
(
SELECT @cr := @cr + 1 as rn,
date_sub(curdate(), interval 7 - @cr day) as dates
from information_schema.tables c1
cross join (SELECT @cr := 0, @segID := 30) r
where @cr<7
) d on c.campaign_id = d.rn
where coalesce(c.segment_id,@segID) = @segID
) e;
count dates
0 24.12.2018
1 25.12.2018
1 26.12.2018
0 27.12.2018
0 28.12.2018
0 29.12.2018
3 30.12.2018
Рассмотрите возможность обработки проблем с отображением данных в коде приложения.