【问题标题】:group by unique month per year, not just month [duplicate]按每年唯一的月份分组,而不仅仅是月份[重复]
【发布时间】:2012-12-04 00:41:48
【问题描述】:

可能重复:
MySQL Query GROUP BY day / month / year

我有以下mysql:

SELECT MONTH( FROM_UNIXTIME(  `timeStamp` ) ) as month , COUNT(  `id` )  as count
FROM  `discusComments` 
GROUP BY MONTH( FROM_UNIXTIME(  `timeStamp` ) ) 
ORDER BY  MONTH( FROM_UNIXTIME(  `timeStamp` ) ) ASC 
LIMIT 15

它获取过去 15 个月内每月的条目数量。我想知道为什么它只显示过去 12 个月……然后我意识到计数是所有年份的总和,而不是每个月的唯一年份。所以 12 月的值可能是 2012 年和 2011 年的加起来。

我不想要这个。我想获得过去 15 个月以及 UNIQUE 月份年份的条目数量,例如2012 年 12 月、2012 年 11 月等。

【问题讨论】:

  • 月回报1-12(含)
  • 我不知道如何使它按“月年”分组,而不仅仅是“月”或“年”

标签: php mysql sql


【解决方案1】:

将年份添加到您的 SELECT 列列表,并将别名添加到 GROUP BY

SELECT YEAR(FROM_UNIXTIME(`timestamp`))  AS year, 
       MONTH(FROM_UNIXTIME(`timestamp`)) AS month, 
       COUNT(`id`)                       AS count 
FROM   `discuscomments` 
GROUP  BY year, 
          month 
ORDER  BY year,
          month
LIMIT  15 

【讨论】:

    【解决方案2】:

    对此我最直接的想法通常是将日期值的格式更改为一个唯一且能说话的字符串,例如 2012 年 12 月的 2012-12 和 2011 年 10 月的 2011-10 等。

    您可以使用的函数是DATE_FORMAT()

     DATE_FORMAT(FROM_UNIXTIME(timeStamp), '%Y-%m')
    

    这些字符串很容易排序,例如ASC:

    2011-10
    2011-11
    2011-12
    ...
    2012-10
    2012-11
    2012-12
    

    示例 SQL 查询:

    SELECT
      DATE_FORMAT(FROM_UNIXTIME(timeStamp), '%Y-%m') as month, 
      COUNT(id) as count
    FROM  discusComments
    GROUP BY month
    ORDER BY month ASC 
    LIMIT 15
    

    【讨论】:

    • 但这会增加复杂性,因为稍后您必须拆分 month 列。
    • 是的,它只是某种“自己动手”/“帮助自己”的解决方案,甚至适用于低级系统。您的答案更好地采用 SQL 本身。也只是看到MySQL Query GROUP BY day / month / year
    【解决方案3】:

    试试这个

    months_between(to_date ('2009/05/15', 'yyyy/mm/dd'), 
                         to_date ('2009/04/16', 'yyyy/mm/dd'))
    

    【讨论】:

    • 嘿,您可能应该详细说明为什么您的解决方案会起作用
    猜你喜欢
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 2022-07-25
    • 1970-01-01
    • 2010-12-25
    • 2013-02-05
    • 2015-08-17
    • 2014-08-07
    相关资源
    最近更新 更多