Я работаю с запросом, где я получаю счет по датам, когда есть кампания, я также хочу получить счет 0, если нет кампании в диапазоне дат

Диапазон дат - последние семь дней. в настоящее время я получаю эти данные из этого запроса

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

Рассмотрите возможность обработки проблем с отображением данных в коде приложения.

Strawberry 30.12.2018 15:55

Спасибо, мне удалось решить проблему на уровне приложения

Asad Zaidi 30.12.2018 17:18
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
2
44
2

Ответы 2

Вам нужен способ создания всех дат. Стандартный ответ - использовать 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  

Демо Rextester

Другие вопросы по теме