【问题标题】:MySQL date query only returns one year, when multiple existMySQL日期查询仅返回一年,当多个存在时
【发布时间】:2010-04-19 18:39:33
【问题描述】:

我是一名兼职设计师/开发人员,从事兼职摄影业务。我有一个附有各种元数据的照片数据库。我想查询数据库并返回一张照片拍摄年份的列表,以及当年拍摄的照片数量。

简而言之,我想要一个如下所示的列表:

2010 (35 photos)
2009 (67 photos)
2008 (48 photos)

这是我正在使用的查询:

SELECT YEAR(date) AS year, COUNT(filename) as quantity FROM photos WHERE visible='1' GROUP BY 'year' ORDER BY 'year' DESC

而不是大量列出所有可能的年份(数据库包括 2010-2008 年的照片),这是唯一的结果:

2010 (35 photos)

我尝试了很多不同的语法,但现在我放弃并寻求帮助!

【问题讨论】:

    标签: mysql date count


    【解决方案1】:

    不要单引号 year
    那就是告诉 MySQL year 是一个字符串;它不是。

    此外,不要在GROUP BY 中使用别名。

    试试这个:

    SELECT YEAR(date) AS year, COUNT(filename) as quantity 
    FROM photos 
    WHERE visible='1' 
    GROUP BY YEAR(date)
    ORDER BY YEAR(date) DESC
    

    编辑:
    在大多数 RDBMS 中,SELECT 子句最后解释。
    因此,我们不能在该特定查询的其他子句中使用列别名。

    【讨论】:

    • 是的!它工作得很好,我现在明白了这个错误。谢谢你,亚当。
    • 后续问题:为什么不用别名?它确实有效并且看起来更高效,但也许不是......?
    • @Bowman:添加了更多关于为什么不在GROUP BY 中使用别名的信息。您的查询可能适用于 MySQL,但可能不适用于其他 RDBMS。如果您坚持使用 MySQL,那对您来说可能不是问题。很高兴查询现在可以工作了:-)
    • 优秀。我正在使用 MySQL,但我感谢您的澄清。感谢您花时间解释。
    【解决方案2】:

    T-SQL 解决方案:

    SELECT 
       [text] = 
          cast(year(date) as varchar) + ' ('+cast(count(filename) as varchar) + 
          'photo'+case when count(filename)>1 then 's' else '' end + ')'
       ,
       [year] = year(date)
    FROM photos 
    WHERE  visible='1' 
    GROUP BY YEAR(date)
    ORDER BY YEAR(date) DESC
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多