Подтвердить что ты не робот

Аналогичен 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 ..
4b9b3361

Ответ 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