Получить отчет за последнюю неделю всех дней, включая дни с 0 отсчетом - PullRequest
1 голос
/ 06 марта 2020

Я пытаюсь получить отчет о записях / билетах прошлой недели и показать 0, если в тот день не было ни одной записи, а затем показать его в линейном графике Google для проекта. MySQL таблица выглядит следующим образом

----------------------------------
id   body      timeSent
----------------------------------
1   someText   2020-02-29 15:48:18
2   someText   2020-03-02 11:32:07
3   someText   2020-03-02 11:32:07
4   someText   2020-03-04 12:11:13
5   someText   2020-03-05 09:32:09
----------------------------------

Я написал запрос вот так

SELECT count(*) as count_tickets, 
substr(timeSent,1,10) AS datetime 
FROM tableName 
WHERE substr(timeSent,1,10) >= DATE(NOW()) - INTERVAL 7 DAY
GROUP BY substr(timeSent,1,10)
ORDER BY timeSent

Вывод выглядит так

----------------------------------
     count_tickets      dateTime    
   ----------------------------------
        1               2020-02-29
        2               2020-03-02
        1               2020-03-04
        1               2020-03-05
   ----------------------------------

Какой у меня требуемый вывод

----------------------------------
     count_tickets      dateTime    
   ----------------------------------
        1               2020-02-29
        0               2020-03-01
        2               2020-03-02
        0               2020-03-03
        1               2020-03-04
        1               2020-03-05
        0               2020-03-06
   ----------------------------------

Как мне этого добиться

1 Ответ

1 голос
/ 06 марта 2020

В течение всего 7 дней одним из методов является использование производной таблицы чисел и left join с исходной таблицей:

select 
    count(t.timesent) as count_tickets, 
    current_date - interval x.n day as datetime 
from (
    select 0 n union all select 1 union all select 2 union all select 3
    union all select 4 union all select 5 union all select 6
) x
left join tablename t
    on  t.timesent >= current_date - interval x.n day
    and t.timesent <  current_date - interval (x.n - 1) day
group by x.n
order by x.n desc

Демонстрация на DB Fiddle :

count_tickets | datetime  
------------: | :---------
            1 | 2020-02-29
            0 | 2020-03-01
            2 | 2020-03-02
            0 | 2020-03-03
            1 | 2020-03-04
            1 | 2020-03-05
            0 | 2020-03-06
...