web-dev-qa-db-ja.com

MySQLで同等のgenerate_series()

クエリを実行して1年中すべての曜日に参加する必要がありますが、データベースにカレンダーテーブルがありません。
グーグルで検索した後、PostgreSQLでgenerate_series()を見つけました。 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 ..
19
stighy

これが私のやり方です。 2011-01-01から2011-12-31までの日付の範囲を作成します。

select 
    date_format(
        adddate('2011-1-1', @num:=@num+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をそのクエリで使用するテーブルの1つにすることができます。

26
Karolis

私はこの解決策を探していましたが、「ハードコードされた」日付がなく、今年有効なこの解決策を思いつきました(これから助けられました answers )。注意してください

where year(date)=2011

selectはすでに日付をフィルタリングしているため、必要ありません。また、このように、日付は実行時に「計算」されるため、どのテーブル(少なくともテーブルに少なくとも366行が含まれる前に述べたように)が使用されても問題ありません。

 select date from (
    select
        date_format(
        adddate(MAKEDATE(year(now()),1), @num:=@num+1),
        '%Y-%m-%d'
    ) date
    from
        your_table,
    (select @num:=-1) num
    limit
        366 ) as dt
4
Carmine

@Karolisのソリューションの拡張バージョンで、任意の年(うるう年を含む)で確実に機能します。

 select date from(
 select 
 date_format(
 adddate( '2011-1-1'、@ num:= @ num + 1)、
 '%Y-%m-%d' 
)date 
 from 
 any_table、
(select @num:=-1)num 
 limit 
 366 
)as dt 
 where year(date)= 2011 
4
davpar