sql >> Database teknologi >  >> RDS >> Mysql

MySQL Count data for de sidste 7 dage

MySQL har ikke rekursiv funktionalitet, så du står tilbage med at bruge NUMBERS tabeltricket -

  1. Opret en tabel, der kun indeholder stigende tal - let at lave ved hjælp af et 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. Udfyld tabellen med:

    INSERT INTO NUMBERS
      (id)
    VALUES
      (NULL)
     

    ...for så mange værdier, som du har brug for.

  3. Brug DATE_ADD for at konstruere en liste over datoer og øge dagene baseret på NUMBERS.id-værdien. Erstat "2010-01-01" og "2010-01-02" med dine respektive start- og slutdatoer (men brug samme format, ÅÅÅÅ-MM-DD TT:MM:SS). I dette eksempel trak jeg værdien NUMBERS.id fra CURRENT_DATE for at få en liste over sekventielle datoværdier for den sidste uge -

    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 på din tabel med data baseret på dato- og klokkeslætsdelen.

    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

Hvorfor tal, ikke datoer?

Simpel - datoer kan genereres baseret på antallet, som i det eksempel, jeg gav. Det betyder også at bruge en enkelt tabel, i modsætning til f.eks. én pr. datatype.

Tidligere:

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

  1. 60 millioner poster, vælg poster fra en bestemt måned. Hvordan optimerer man databasen?

  2. adgang nægtet ved brug af JDBC fra en browser-applet

  3. #1366 - Forkert heltalsværdi:MYsql

  4. Streaming direkte til en database