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

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

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

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Вы можете создать 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 Demo

0 голосов
/ 30 декабря 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...