2012-03-26 3 views
1

指定した範囲内の毎月の行を返したいと思います。問題があるのは、行がない場合は何も返されません。私が欲しかったのは、返される月の名前とwinner_idがnullになることです。SQLの日付範囲内のアイテムを返す

私のこれまでの質問。私は私の出力は次のようになりたい何

SELECT MONTHNAME(dated) as Month, winner_id FROM competitions WHERE dated > '2012-01-01' 

は私はDB-で1月または4月の行を持っていないされて

Month  Winner_id 
------------------- 
January NULL 
February 2654 
March  19864 
April  NULL 

問題ですが、私はまだ月が返さたいですか?

私はphpで月間を行い、毎月個別のクエリを行うべきですか?

+0

結果に数年間のデータが含まれているとしたらどうなりますか? – Devart

+0

競争は毎月次の6ヶ月間実行されています.1年以上のデータは含まれていません –

答えて

1

ありMySQLでこれを行う方法があるが、それはあなたのケースでやり過ぎでしょう。 TEMPORARY CREATE

- 6ヶ月間の数字で一時テーブルを作成します(あるいは単に労働組合とSELECTクエリを使用)

$res = mysql_query("SELECT MONTH(dated) as month, winner_id". 
        " FROM competitions WHERE dated > '2012-01-01'"); 
$months = array(); 
for($i = 1; $i <= 6; ++$i) $month[$i] = 0; 
while($r = mysql_fetch_assoc($res)) { 
    $month[$r['month']] = $r['winner_id']; 
} 
... 
+0

これは私が使用した方法です –

0

MySQLにすべての月のリストを返す関数があるかどうかはわかりません。したがって、最終的にあなたのテーブルに月がない場合、実行時にその月の名前をフェッチすることはできません。スクリプトから何ヶ月も渡して、それに応じてレコードをフェッチする必要があるかもしれません。

1

あなたはすべての月のためのカスタム列を作成する必要があります。

は、以下にお試しください:

SELECT a,c.Winner_id 
    FROM 
    (
    select 'January' as a union all select 'Febuary' union all select 'March' 
    union all select 'April' union all select 'May' union all select 'June' union all 
    select 'July' union all select 'August' union all select 'September' union all 
    select 'October' union all select 'November' union all select 'December' 
    ) as a 
    LEFT JOIN competitions as c on a.a=monthname(c.dated) 
    WHERE c.dated > '2012-01-01' 
1

:私はあなたの現在のクエリのバリエーションを使用して、PHPでのギャップを埋めるだろうテーブル月(m INT); INSERT INTO months VALUE(1)、(2)、(3)、(4)、(5)、(6);

次にこのテーブルにテーブルを参加させてください。テーブル。 -

SELECT t1.m Month, c.winner_id FROM 
    (SELECT @m:=MONTH('2012-01-01') + m, IF(@m > 12, @m - 12, @m) m FROM months) t1 
    LEFT JOIN competitions c 
    ON t1.m = c.MONTH(dated) 
WHERE c.dated > '2012-01-01'