最近7天的MySQL计数数据 [英] MySQL Count data for last 7 days

查看:109
本文介绍了最近7天的MySQL计数数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下架构.

桌票

+------------------+--------------+------+-----+---------------------+----------------+
| Field            | Type         | Null | Key | Default             | Extra          |
+------------------+--------------+------+-----+---------------------+----------------+
| id               | int(10)      | NO   | PRI | NULL                | auto_increment |
| aid              | varchar(10)  | NO   |     |                     |                |
| ip               | varchar(100) | NO   |     |                     |                |
| host             | varchar(200) | NO   |     |                     |                |
| timestamp        | varchar(20)  | NO   |     | 0000-00-00 00:00:00 |                |
| user             | tinytext     | NO   |     | NULL                |                |
| userid           | int(10)      | NO   |     | 0                   |                |
+------------------+--------------+------+-----+---------------------+----------------+

在这里,我要获取过去7天中每天的每项援助计数,在没有任何援助票的日期为"0".时间戳是Unix时间戳.

Here I want to get the count of each aid on a day for the last 7 days with "0"s for the dates where there a no votes for aid. timestamp is unix timestamp here.

我们非常感谢您的帮助.

Any help is highly appreciated.

推荐答案

MySQL没有递归功能,因此您只需要使用NUMBERS表技巧-

MySQL doesn't have recursive functionality, so you're left with using the NUMBERS table trick -

  1. 创建仅包含递增数字的表-使用auto_increment易于完成:

  1. Create a table that only holds incrementing numbers - easy to do using an auto_increment:

DROP TABLE IF EXISTS `example`.`numbers`;
CREATE TABLE  `example`.`numbers` (
  `id` int(10) unsigned NOT NULL auto_increment,
   PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

  • 使用以下表格填充表格:

  • Populate the table using:

    INSERT INTO NUMBERS
      (id)
    VALUES
      (NULL)
    

    ...根据需要提供任意数量的值.

    ...for as many values as you need.

    使用 DATE_ADD 构建日期列表,并根据NUMBERS.id值增加日期.用您各自的开始和结束日期替换"2010-01-01"和"2010-01-02"(但使用相同的格式,YYYY-MM-DD HH:MM:SS).在此示例中,我从CURRENT_DATE中减去了NUMBERS.id值,以获得上周的顺序日期值列表-

    Use DATE_ADD to construct a list of dates, increasing the days based on the NUMBERS.id value. Replace "2010-01-01" and "2010-01-02" with your respective start and end dates (but use the same format, YYYY-MM-DD HH:MM:SS). In this example, I subtracted the NUMBERS.id value from the CURRENT_DATE to get a list of sequential date values for the last week -

    SELECT x.dt
      FROM (SELECT DATE_SUB(CURRENT_DATE, INTERVAL (n.id - 1) DAY) AS dt
              FROM numbers n
             WHERE n.id <= 7 ) x
    

  • 根据日期时间部分将联接左移到数据表中.

  • LEFT JOIN onto your table of data based on the datetime portion.

       SELECT x.dt,
               COUNT(v.aid) AS num
         FROM (SELECT DATE_SUB(CURRENT_DATE, INTERVAL (n.id - 1) DAY) AS dt
                 FROM numbers n
                WHERE n.id <= 7 ) x
    LEFT JOIN VOTES v ON DATE(FROM_UNIXTIME(v.timestamp)) = DATE(x.dt)
     GROUP BY x.dt
     ORDER BY x.dt
    

  • 为什么用数字而不是日期?

    简单-可以根据数字生成日期,就像我提供的示例一样.这也意味着只使用一个表,而不是每个数据类型一个表.

    Why Numbers, not Dates?

    Simple - dates can be generated based on the number, like in the example I provided. It also means using a single table, vs say one per data type.

      SELECT DATE(FROM_UNIXTIME(v.timestamp)) AS dt,
             COUNT(v.aid)
        FROM VOTES v
       WHERE DATE(FROM_UNIXTIME(v.timestamp)) BETWEEN DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY)
                                                  AND CURRENT_DATE
    GROUP BY DATE(FROM_UNIXTIME(v.timestamp))
    

    这篇关于最近7天的MySQL计数数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆