Аналогичен generic_series() в MySQL
Мне нужно сделать запрос и присоединиться ко всем дням года, но в моем db нет таблицы календаря.
После google-ing я нашел generate_series()
в PostgreSQL. Есть ли у MySQL что-то подобное?
В моей фактической таблице есть что-то вроде:
date qty
1-1-11 3
1-1-11 4
4-1-11 2
6-1-11 5
Но мой запрос должен вернуть:
1-1-11 7
2-1-11 0
3-1-11 0
4-1-11 2
and so on ..
Ответы
Ответ 1
Вот как я это делаю. Он создает диапазон дат с 2011-01-01 по 2011-12-31:
select
date_format(
adddate('2011-1-1', @num:[email protected]+1),
'%Y-%m-%d'
) date
from
any_table,
(select @num:=-1) num
limit
365
-- use limit 366 for leap years if you're putting this in production
Единственное требование состоит в том, что количество строк в any_table должно быть больше или равно размеру требуемого диапазона ( >= 365 строк в этом примере). Скорее всего, вы будете использовать это как подзапрос вашего всего запроса, поэтому в вашем случае any_table может быть одной из таблиц, которые вы используете в этом запросе.
Ответ 2
Расширенная версия решения от @Karolis, которая гарантирует, что она работает в течение любого года (включая високосные годы):
select date from (
select
date_format(
adddate('2011-1-1', @num:[email protected]+1),
'%Y-%m-%d'
) date
from
any_table,
(select @num:=-1) num
limit
366
) as dt
where year(date)=2011
Ответ 3
Я искал это решение, но без "жестко запрограммированной" даты, и я придумал этот вариант, действительный для текущего года (помог из этого ответов),
Обратите внимание на
where year(date)=2011
не требуется, поскольку выбор уже фильтрует дату. Также этот способ не имеет значения, какая таблица (по крайней мере, как указано выше, чем таблица имеет не менее 366 строк), поскольку дата "вычисляется" во время выполнения.
select date from (
select
date_format(
adddate(MAKEDATE(year(now()),1), @num:[email protected]+1),
'%Y-%m-%d'
) date
from
your_table,
(select @num:=-1) num
limit
366 ) as dt