2010-07-28 7 views
1

J'ai la requête suivante:Comment créer une liste de secondes dans MySQL

SELECT timestamp, 
     COUNT(*) 
    FROM table 
GROUP BY timestamp 

Mais certains horodatages ne montre pas parce qu'il n'y a pas de données. Voici un exemple

1:00:00 | 3 
1:00:02 | 17 
1:00:03 | 2 

Notez qu'il manque 1:00:01. Y at-il un moyen de faire apparaître le 1:00:01 | 0 dans le résultat?

+2

Vous mettriez moins de charge sur le serveur de base de données. –

+2

@webdestroya: Parce que la base de données évoluera mieux que le code de l'application. Malheureusement, MySQL n'a pas de fonctionnalité récursive ... –

Répondre

3

MySQL n'a pas la fonctionnalité récursive, de sorte que vous vous retrouvez avec l'aide de la tour de table CHIFFRES -

  1. Créer une table qui ne contient que le nombre incrémenter - 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. Peupler la table en utilisant:

    INSERT INTO NUMBERS 
        (id) 
    VALUES 
        (NULL) 
    

    ... pour autant de valeurs que vous avez besoin.

  3. Utilisez DATE_ADD pour construire une liste de fois, ce qui augmente les secondes en fonction de la valeur NUMBERS.id:

    SELECT x.* 
        FROM (SELECT DATE_FORMAT(DATE_ADD('2010-01-01', INTERVAL n.id - 1 SECOND), '%T') 
          FROM numbers n) x 
    
  4. LEFT JOIN sur votre table de données en fonction de la partie du temps:

    SELECT x.ts AS timestamp, 
          COALESCE(COUNT(y.timestamp), 0) AS cnt 
        FROM (SELECT DATE_FORMAT(DATE_ADD('2010-01-01', INTERVAL n.id - 1 SECOND), '%T') AS ts 
          FROM numbers n) x 
    LEFT JOIN TABLE y ON y.timestamp = x.ts 
    GROUP BY x.ts 
    
    Pourquoi ne pas faire cette logique dans votre programme?
Questions connexes