我当前的MySQL查询:
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 :(得分: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
当然,年表可以动态生成,也可以通过“不同”子查询生成到另一个表。
答案 1 :(得分: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
我认为加入隐含在懒惰中。
答案 2 :(得分:0)
尝试偷偷摸摸,确保每个人都至少有一条记录:
UNION SELECT '0', '2006'
UNION SELECT '0', '2007'
etc..
我仍然会尝试将此逻辑移到PHP应用程序中。