クエリを実行して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 ..
これが私のやり方です。 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つにすることができます。
私はこの解決策を探していましたが、「ハードコードされた」日付がなく、今年有効なこの解決策を思いつきました(これから助けられました 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
@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