sql >> Database >  >> RDS >> Mysql

MySQL-tellingsgegevens voor de afgelopen 7 dagen

MySQL heeft geen recursieve functionaliteit, dus je blijft achter met de NUMBERS-tabeltruc -

  1. Maak een tabel die alleen oplopende getallen bevat - eenvoudig te doen met een 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. Vul de tabel met:

    INSERT INTO NUMBERS
      (id)
    VALUES
      (NULL)
    

    ...voor zoveel waarden als u nodig heeft.

  3. Gebruik DATE_ADD om een ​​lijst met datums samen te stellen, waarbij de dagen worden verhoogd op basis van de waarde NUMBERS.id. Vervang "2010-01-01" en "2010-01-02" door uw respectievelijke begin- en einddatums (maar gebruik hetzelfde formaat, JJJJ-MM-DD UU:MM:SS). In dit voorbeeld heb ik de waarde NUMBERS.id afgetrokken van de CURRENT_DATE om een ​​lijst met opeenvolgende datumwaarden voor de afgelopen week te krijgen -

    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 op uw gegevenstabel op basis van het datetime-gedeelte.

       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
    

Waarom cijfers, geen datums?

Eenvoudig - datums kunnen worden gegenereerd op basis van het aantal, zoals in het voorbeeld dat ik heb gegeven. Het betekent ook het gebruik van een enkele tabel, in plaats van één per gegevenstype.

Eerder:

  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. Collaboratief filteren in MySQL?

  2. Kan geen verbinding maken met Amazon PostgreSQL RDS-database op R met RPostgreSQL

  3. Oracle Data Provider for .NET verwijderen uit Global Assembly Cache

  4. MySQL - Hoe een Oracle RANK() OVER(ORDER BY score DESC) te doen