MySQL 5上MONTHNAME()的问题

时间:2009-06-03 14:00:48

标签: sql mysql

我正在尝试在我们的数据库上运行报告。我们希望了解每个行业每月的新注册情况。我写过这个问题:

SELECT 
  COUNT(j.jobseeker_id) as new_registrations, 
  i.description as industry_name,
  MONTHNAME(j.created_at)
FROM
  tb_jobseeker as j, tb_industry as i
WHERE 
  YEAR(j.created_at) = 2009 
AND 
  i.industry_id = j.industry_id 
GROUP BY 
  i.description, MONTHNAME(j.created_at)
HAVING
  MONTHNAME(j.created_at) =  MONTHNAME(NOW());

当我运行此查询时,我得到一个空结果集。但是,如果我运行以下内容:

SELECT 
  COUNT(j.seeker_id) as new_registrations, 
  i.description as industry_name,
  MONTHNAME(j.created_at)
FROM
  tb_seeker as j, tb_industry as i
WHERE 
  YEAR(j.created_at) = 2009 
AND 
  i.industry_id = j.industry_id 
GROUP BY 
  i.description, MONTHNAME(j.created_at)
HAVING
  MONTHNAME(j.created_at) =  'June';

它返回我正在寻找的结果。

请帮忙吗?我很难过。

更新:查询将在每个月末或过去一个月的下一个月开始运行。所以,我们现在是六月份,但它需要在五月份运行。希望这是有道理的。

3 个答案:

答案 0 :(得分:2)

做什么:

SELECT MONTHNAME(NOW())

退回服务器?

答案 1 :(得分:1)

Errr ....这不是May O_o

如果您这样写,您的查询会更有效率:

SELECT 
  COUNT(j.jobseeker_id) as new_registrations, 
  i.description as industry_name,
  MONTHNAME(j.created_at)
FROM
  tb_jobseeker as j, tb_industry as i
WHERE 
  j.created_at BETWEEN '2009-05-01' AND '2009-05-31'
AND 
  i.industry_id = j.industry_id 
GROUP BY 
  i.description, MONTH(j.created_at)

如果你绝对必须,你应该只使用HAVING。

如果你可以通过i.id而不是i.description进行分组会更好,但这取决于i.description是否是唯一的。

答案 2 :(得分:0)

可以更好地编写此查询:

SELECT 
 COUNT(j.jobseeker_id) as new_registrations, 
 i.description as industry_name,
 MONTHNAME(j.created_at)
FROM
  tb_jobseeker as j, tb_industry as i
WHERE 
  YEAR(j.created_at) = YEAR(NOW())
  AND MONTH(j.created_at) =  MONTH(NOW())
  AND i.industry_id = j.industry_id 
GROUP BY 
  i.industry_id

分组后应用“HAVING”子句;如果您想根据汇总的结果进行过滤,则需要应用它(例如,获取上个月申请了> 100人的所有行业)。通过industry_id进行分组(我假设是主键)比按字符串(industry_name和monthname)分组更快。最后,如果您只选择一个月,则不需要按月分组。

但是,假设您的表中包含当前实际月份的信息,您应该获得正确的数据。