MySQL Query Проблема с INTERVAL, нужно 0, если данные не предоставлены - PullRequest
2 голосов
/ 18 марта 2011

У меня есть следующее утверждение:

SELECT
count(rs.rsc_id) as counter
FROM shots as rs
where rsc_rs_id = 345354
AND YEAR(rs.timestamp) = YEAR(DATE_SUB(CURDATE(), INTERVAL 6 MONTH))
GROUP BY DATE_FORMAT(rs.timestamp,'%Y%m')

rs.timestamp - это метка времени Unix

Вывод будет выглядеть как для каждой строки / месяца числовое значение, например «28»

Работает нормально, но если у меня есть противоречивые данные, например, только за последние три месяца (не за все шесть месяцев), я не получу возврата из своей базы данных. Я бы хотел, чтобы каждый раз, когда за этот месяц не было данных, возвращалось 0 ...

есть предложения? Я подумал о некоторых случаях, но это не так хорошо ...

спасибо !!

Ответы [ 2 ]

1 голос
/ 18 марта 2011

Только в течение 6 месяцев таблица дат кажется ненужной, хотя это выглядит сложно (на самом деле это не так!)

SELECT DATE_FORMAT(N.PivotDate,'%Y%m'), count(rs.rsc_id) as counter
FROM (
   select ADDDATE(CURDATE(), INTERVAL N MONTH) PivotDate
   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) N) N
LEFT JOIN shots as rs
    ON rsc_rs_id = 345354
    AND DATE_FORMAT(N.PivotDate,'%Y%m')=DATE_FORMAT(FROM_UNIXTIME(rs.timestamp),'%Y%m')
GROUP BY DATE_FORMAT(N.PivotDate,'%Y%m')
1 голос
/ 18 марта 2011

В таких случаях обычно используется таблица dates со всеми датами (например, с 01.01.1970 по 31.12.2999) и LEFT JOIN ваши данные в эту таблицу.

См. Пример в ответе: MySQL объединяет таблицы, создавая пропущенные даты

Если вы создаете таблицу дат, вы можете использовать:

SELECT
DATE_FORMAT(d.date,'%Y%m') AS `month`, count(rs.rsc_id) AS `counter`
FROM dates d
LEFT JOIN shots as rs
   ON d.date = FROM_UNIXTIME(rs.timestamp)
   AND rs.rsc_rs_id = 345354
WHERE d.date > DATE_SUB(CURDATE(), INTERVAL 5 MONTH)
AND d.date < CURDATE()
GROUP BY DATE_FORMAT(d.date,'%Y%m');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...