代码之家  ›  专栏  ›  技术社区  ›  GeekTantra

MySQL过去7天的计数数据

  •  3
  • GeekTantra  · 技术社区  · 14 年前

    我有以下模式。

    桌上投票

    +------------------+--------------+------+-----+---------------------+----------------+
    | 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”。timestamp是这里的unix时间戳。

    任何帮助都是非常感谢的。

    2 回复  |  直到 14 年前
        1
  •  8
  •   OMG Ponies    14 年前

    MySQL没有递归功能,所以您只需使用数字表技巧-

    1. 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;
      
    2. 使用以下命令填充表:

      INSERT INTO NUMBERS
        (id)
      VALUES
        (NULL)
      

    3. 使用 DATE_ADD

      SELECT x.dt
        FROM (SELECT DATE_SUB(CURRENT_DATE, INTERVAL (n.id - 1) DAY) AS dt
                FROM numbers n
               WHERE n.id <= 7 ) x
      
    4. 基于datetime部分将左连接到数据表上。

         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
      

    简单-日期可以根据数字生成,如我提供的示例中所示。它还意味着使用单个表,而不是说每个数据类型使用一个表。

    以前:

      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))
    
        2
  •  0
  •   Anthony Greco    14 年前

    选择COUNT(*)作为投票,aid FROM table WHERE timestamp>@7DaysAgo GROUP BY aid