Вам нужно создать таблицу за последние три месяца, а затем LEFT JOIN
, чтобы добавить ее в таблицу рабочих заданий (используя месяц рабочего задания), чтобы получить желаемые результаты.Таблицу за последние 3 месяца можно сгенерировать с помощью вывода UNION
:
SELECT NOW() AS month
UNION
SELECT NOW() - INTERVAL 1 MONTH
UNION
SELECT NOW() - INTERVAL 2 MONTH
(по состоянию на 2018-12-07):
month
2018-12-07 11:06:15
2018-11-07 11:06:15
2018-10-07 11:06:15
Обратите внимание, что все в порядкечтобы вычесть 1 месяц из даты, как если бы число дней превышало число дней в предыдущем месяце, оно будет скорректировано в сторону понижения, чтобы сделать дату действительной (см. руководство ).
Окончательный запрос становится:
SELECT MONTHNAME(m.month) AS month_name, YEAR(m.month) AS year_name,
MONTH(m.month) AS month_no, COUNT(wo.Wo_id) work_orders
FROM (SELECT NOW() AS month
UNION
SELECT NOW() - INTERVAL 1 MONTH
UNION
SELECT NOW() - INTERVAL 2 MONTH) m
LEFT JOIN work_orders wo ON MONTH(wo.updated_at) = MONTH(m.month) AND
YEAR(wo.updated_at) = YEAR(m.month)
GROUP by m.month, year_name
ORDER BY m.month DESC
Обратите внимание, что нам не нужно предложение WHERE
, так как значения в таблице month
ограничивают данные за последние 3 месяца, которые нас интересуютТакже мы используем LEFT JOIN
, чтобы получить результат за каждый месяц, даже если в этом месяце не было рабочих заданий.
Вывод:
month_name year_name month_no work_orders
December 2018 12 3
November 2018 11 0
October 2018 10 5
Демонстрация на dbfiddle