2009-05-15 13 views
1

私の現在のMySQLのクエリ:グループ化データ - なしの結果を得るために0を返します

SELECT MAX(s.con_grade) AS max, YEAR(u.sent_date) AS year 
FROM pdb_usersectionmap u 
LEFT JOIN pdb_sections s ON u.section_id = s.id 
WHERE u.user_id =21 
AND YEAR(u.sent_date) > '2004-01-01' 
GROUP BY YEAR(u.sent_date) 
ORDER BY u.sent_date ASC 

(年とUSER_IDはPHPで動的に生成されている)私はのために結果を表示しようとしている

過去5年間。状況によっては、その年にMAXを取得できないことがあります。例えば、このユーザーは、最後の3年間でのエントリ(しかし、その前にノー年)があります:

max  year 
5  2007 
6.05 2008 
7  2009 

私の質問: 私は、特定の年のエントリを探すためにMySQLを伝える場合、どのような方法がありますエントリが見つからない場合、MySQLはその年の "0"を返しますか?

year max 
2005  0 
2006  0 
2007  5 
2008  6.05 
2009  7 

答えて

0
isnull(<field>, <value>) 

は私はあなたに例を挙げましょう:出力は(私に多くの時間を節約します)であるためには

理想的には、私は大好きです。

SELECT ISNULL(MAX(s.con_grade),0) AS [max] 
     ,YEAR(u.sent_date) AS [year] 
    FROM pdb_usersectionmap u, 
     ,pdb_sections s 
WHERE u.section_id = s.id 
    AND u.user_id = 21 
    AND YEAR(u.sent_date) > '2004-01-01' 
ORDER 
    BY u.sent_date 

私は怠惰から暗黙のうちに参加しました。回り込みは、この、あなたがのために少なくとも1つのレコードを持っていることを確認しようとすると

+0

#1582 - ネイティブ関数 'ISNULL'の呼び出しで不正なパラメータがカウントされる IFNULLである必要がありますか? – jmccartie

+0

ああ、多分。私は、mysqlにisnullがあると仮定していると思います。これはmssql関数です。同等のものがあると確信しています。 – Daniel

0

各ええ:

UNION SELECT '0', '2006' 
UNION SELECT '0', '2007' 
etc.. 

私はまだ試してみて、あなたのPHPアプリケーションにこのロジックを移動すると思います。これを行うための

1

一つの正しい方法は、年テーブルを持つことへの外部結合をやって、そしてそのテーブルの年の列でグループ化、このような何か(テストしていません)

SELECT MAX(s.con_grade) AS max, YEAR(u.sent_date) AS year 
FROM pdb_usersectionmap u 
LEFT JOIN pdb_sections s ON u.section_id = s.id 
RIGHT JOIN years y ON year = y.year_id 
WHERE u.user_id =21 
AND y.year_id > 2004 
GROUP BY y.year_id 
ORDER BY u.sent_date ASC 

ことになる年テーブルは、オンザフライで生成することも、別のテーブルに対して「別個の」サブクエリを生成することもできます。

関連する問題