【问题标题】:Problems with MONTHNAME() on MySQL 5MySQL 5 上的 MONTHNAME() 问题
【发布时间】:2009-06-03 14:00:47
【问题描述】:

我正在尝试对我们的数据库运行报告。我们想知道每个行业每月的新注册量。我写了这个查询:

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';

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

有什么帮助吗?我被难住了。

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

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    做什么:

    SELECT MONTHNAME(NOW())
    

    返回你的服务器?

    【讨论】:

      【解决方案2】:

      Err....不是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 是否唯一。

      【讨论】:

      • 哦,对不起,格雷格,我是说六月。感谢你的回答。有没有办法让 j.created_at 自动化,因为这个查询每个月都会通过管理控制台运行?
      • 嘿,格雷格,你的似乎正在工作。有没有办法避免 j.created_at 的硬编码值?
      • 你可以使用 DATE(NOW()) 但最好“硬编码”它(实际上你会在你的应用程序中将它作为参数传递) - 如果你使用 NOW() 然后查询缓存无法存储。
      • 你说的很对。传入参数,效果很好。谢谢,格雷格。
      【解决方案3】:

      这个查询可以写得更好:

      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 人的所有行业),则需要应用它。按行业标识(我假设它是主键)分组比按字符串(行业名称和月份名称)分组要快。最后,如果您只选择单个月份,则不需要按月份分组。

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

      【讨论】:

      • 嗨,托德,感谢您的贡献。我尝试运行该查询,但它返回了一个空结果集。有什么想法吗?
      • 刚刚编辑过。有时您会在数字 (2009) 和文字 ('2009') 之间遇到 CAST 问题。这是一个长镜头,但也许新的有效?
      猜你喜欢
      • 2017-01-15
      • 2010-09-25
      • 2014-11-23
      • 2019-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      相关资源
      最近更新 更多