MySQL возвращает все строки, независимо от того, существуют данные или нет - PullRequest
0 голосов
/ 07 декабря 2018

Вот часть таблицы, из которой я получаю данные за последние 3 месяца, включая текущий месяц.

+-------------+-----------------------+
| Wo_id       | updated_at            | 
+-------------+-----------------------+
|           1 | 2018-12-05 10:38:06   |
|           2 | 2018-12-02 15:21:17   |
|           3 | 2018-12-01 22:18:53   |
|           4 | 2018-10-25 10:38:06   |
|           5 | 2018-10-18 15:21:17   |
|           6 | 2018-10-16 22:18:53   |
|           7 | 2018-10-19 10:26:19   |
|           8 | 2018-10-27 07:06:52   |
|           9 | 2018-09-25 11:35:09   |
|          10 | 2018-09-18 12:54:27   |

Я попытался выполнить запрос:

SELECT MONTHNAME(updated_at) month,YEAR(updated_at) year_name, 
MONTH(updated_at) month_no, COUNT(*) work_orders 
FROM work_orders where updated_at >= last_day(now()) + interval 1 day - interval 3 month 
GROUP by MONTH(updated_at),YEAR(updated_at) 
ORDER BY MONTH(updated_at) DESC

Вывод ЯКак мы видим, запрос игнорирует ноябрь, поскольку его данные отсутствуют в таблице.Включая September, чтобы завершить цикл из 3 месяцев, что неправильно.Я хочу вывод, подобный этому

+-------------+-------------+----------+-------------+
| month       | year_name   | month_no | work_orders |
+-------------+-------------+----------+-------------+
| December    |      2018   | 12       |      3      |
| November    |      2018   | 9        |      0      |
| October     |      2018   | 10       |      5      |

Может ли кто-нибудь помочь мне изменить вышеупомянутый запрос.Спасибо

1 Ответ

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

Вам нужно создать таблицу за последние три месяца, а затем 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

...