sql >> Databasteknik >  >> RDS >> Mysql

MySQL Count-data för de senaste 7 dagarna

MySQL har inte rekursiv funktionalitet, så du får använda tabellen NUMBERS -

  1. Skapa en tabell som bara innehåller ökande siffror – lätt att göra med ett 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. Fyll i tabellen med:

    INSERT INTO NUMBERS
      (id)
    VALUES
      (NULL)
    

    ...för så många värden du behöver.

  3. Använd DATE_ADD för att skapa en lista med datum, öka dagarna baserat på värdet NUMBERS.id. Ersätt "2010-01-01" och "2010-01-02" med dina respektive start- och slutdatum (men använd samma format, ÅÅÅÅ-MM-DD HH:MM:SS). I det här exemplet subtraherade jag värdet NUMBERS.id från CURRENT_DATE för att få en lista med sekventiella datumvärden för den senaste veckan -

    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 till din datatabell baserat på datetime-delen.

       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
    

Varför siffror, inte datum?

Enkelt - datum kan genereras baserat på antalet, som i exemplet jag gav. Det innebär också att man använder en enda tabell, jämfört med säg en per datatyp.

Tidigare:

  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. JpaSpecificationExecutor JOIN + BESTÄLL AV i specifikation

  2. Laravel wherebetween med orwherebetween

  3. Förstå "datetime2" lagringsstorlek i SQL Server

  4. Varför kommer NULL-värden först när man beställer DESC i en PostgreSQL-fråga?