【问题标题】:mysql grouping by daysmysql 按天分组
【发布时间】:2011-04-06 08:29:21
【问题描述】:

我有这个方案:

+-------+
|posts: |
+----+--+--------+--------------------+
| ID |   title   |      timestamp     |
+----+-----------+--------------------+
|  1 |    t1     |2011-04-05 17:54:55 |
+----+-----------+--------------------+ 
|  2 |    t2     |2011-04-06 09:10:11 |
+----+-----------+--------------------+ 
|  3 |    t3     |2011-04-07 02:07:22 |
+----+-----------+--------------------+ 

我如何获得过去 7 天的帖子总数,如下所示:

monday: 3
Tuesday: 9
Wednesday: 2

【问题讨论】:

    标签: mysql grouping days


    【解决方案1】:

    MySQL具体解决方案:

    SELECT WEEKDAY(timestamp_field) AS wd, count(*) FROM your_table GROUP BY wd;
    

    SELECT count(*) FROM your_table GROUP BY WEEKDAY(timestamp_field);
    

    【讨论】:

    • 效果很好,但是当一天为零时,该天不在数组中。
    • @greenbandit 你真的需要零计数行吗?所有缺少的工作日显然都可以在应用程序级别填充。
    【解决方案2】:

    嗯,

    您必须选择日期、计数 (*) 并按日期分组。

    SELECT date_format(TIMESTAMP, '%d %m')
           , COUNT(*)
    FROM posts
    WHERE TIMESTAMP BETWEEN FROMDATE AND TODATE
    GROUP BY date_format(TIMESTAMP, '%d %m')
    

    进一步的帮助和解释: MySQL Manual for DATE_FORMAT

    编辑:

    平日也可以通过使用 %W 来实现。

    【讨论】:

      【解决方案3】:
      SELECT WEEKDAY(timestamp), count(*)
      FROM POSTS as p1
      WHERE DATE_SUB(NOW(), INTERVAL 7 DAY) < timestamp
      GROUP BY YEAR(timestamp), MONTH(timestamp), DAY(timestamp)
      ORDER BY YEAR(timestamp) desc, MONTH(timestamp) desc, DAY(timestamp) desc
      

      查看 MySQL 中的 date and time functions

      【讨论】:

      • 但是如果某天有 0 个条目,那一天就丢失了。
      • 添加了工作日(时间戳)以进行澄清。如果 0 个条目,则不会从一个表中显示行。除非有其他表包含每天的信息,否则我们可以进行左连接以确保所有行都在那里,但它会导致相对较高的开销。相反,我建议您可以在服务器端对此进行简单检查。
      猜你喜欢
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多