Вот один из способов сделать это.Я вставил $startMonth
и $endMonth
, чтобы вы могли видеть, как они играют. (У меня такое чувство, что это может быть упрощено, но это ускользает от меня):
SET @MONTH:=$startMonth-1;
SELECT month, link_id, type_id, SUM(value) AS value
FROM (SELECT @MONTH:=@MONTH+1 as month
FROM foo f
LIMIT $endMonth-$startMonth+1) a
LEFT JOIN foo f
ON a.month >= f.start AND a.month <= f.end
GROUP BY link_id, type_id, a.month;
Путьэто работает: предположим, у вас есть таблица a
:
+-------+
| month |
+-------+
|201201 |
|201202 |
+-------+
Тогда запрос, который вы ищете, будет намного проще обработать:
SELECT month, link_id, type_id, SUM(value) AS value
FROM a
LEFT JOIN foo
ON a.month >= f.start AND a.month <= f.end
GROUP BY link_id, type_id, a.month;
Т.е. вы присоединяетесь к таблице a
до foo
, убедившись, что month
находится между начальным и конечным периодами, а затем вы просто суммируете значение, группируя по месяцу, идентификатору ссылки и идентификатору типа.
Итак, проблема в том,как сгенерировать таблицу a
, которая содержит числа от $startMonth
до $endMonth
.Следовательно:
SET @MONTH:=201200;
SELECT @MONTH:=@MONTH+1 AS month
FROM foo
LIMIT 2;
Это дает таблицу чисел, начинающихся с 201201
и с 2 строками, то есть до 201202
.В этом запросе FROM foo
является фиктивным - на самом деле не используется.