Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL Compte les données des 7 derniers jours

MySQL n'a pas de fonctionnalité récursive, il vous reste donc à utiliser l'astuce de la table NUMBERS -

  1. Créez une table qui ne contient que des nombres incrémentiels - facile à faire en utilisant un 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;
    
  2. Remplir le tableau en utilisant :

    INSERT INTO NUMBERS
      (id)
    VALUES
      (NULL)
    

    ...pour autant de valeurs que nécessaire.

  3. Utilisez DATE_ADD pour construire une liste de dates, en augmentant le nombre de jours en fonction de la valeur NUMBERS.id. Remplacez "2010-01-01" et "2010-01-02" par vos dates de début et de fin respectives (mais utilisez le même format, AAAA-MM-JJ HH:MM:SS). Dans cet exemple, j'ai soustrait la valeur NUMBERS.id de CURRENT_DATE pour obtenir une liste de valeurs de date séquentielles pour la semaine dernière -

    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 sur votre table de données basée sur la partie 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
    

Pourquoi des chiffres, pas des dates ?

Simple - les dates peuvent être générées en fonction du nombre, comme dans l'exemple que j'ai fourni. Cela signifie également utiliser une seule table, plutôt qu'une par type de données.

Auparavant :

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