sql >> Base de Datos >  >> RDS >> Mysql

Datos de MySQL Count de los últimos 7 días

MySQL no tiene funcionalidad recursiva, por lo que te queda usar el truco de la tabla NUMBERS -

  1. Cree una tabla que solo contenga números incrementales, fácil de hacer usando un auto_incremento:

    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. Complete la tabla usando:

    INSERT INTO NUMBERS
      (id)
    VALUES
      (NULL)
    

    ...para tantos valores como necesites.

  3. Use DATE_ADD para construir una lista de fechas, aumentando los días según el valor de NUMBERS.id. Reemplace "2010-01-01" y "2010-01-02" con sus respectivas fechas de inicio y finalización (pero use el mismo formato, AAAA-MM-DD HH:MM:SS). En este ejemplo, resté el valor NUMBERS.id de CURRENT_DATE para obtener una lista de valores de fecha secuencial para la última semana -

    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. LEFT JOIN en su tabla de datos según la porción de fecha y hora.

       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
    

¿Por qué números, no fechas?

Simple:las fechas se pueden generar en función del número, como en el ejemplo que proporcioné. También significa usar una sola tabla, en vez de una por tipo de datos.

Anteriormente:

  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))