sql >> Database >  >> RDS >> Mysql

Groeperen op datum, rij terug, zelfs als er geen records zijn gevonden

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-03-01" door uw respectievelijke begin- en einddatums (maar gebruik hetzelfde formaat, JJJJ-MM-DD) -

    SELECT x.*
      FROM (SELECT DATE_ADD('2010-01-01', INTERVAL n.id - 1 DAY)
              FROM numbers n
             WHERE DATE_ADD('2010-01-01', INTERVAL n.id -1 DAY) <= '2010-03-01' ) x
    
  4. LEFT JOIN op uw gegevenstabel op basis van het datetime-gedeelte:

       SELECT DATE(x.dt) AS dt,
              COALESCE(SUM(e.value), 0) AS sum_value
         FROM (SELECT DATE_ADD('2010-01-01', INTERVAL n.id - 1 DAY) AS dt
                 FROM numbers n
                WHERE DATE_ADD('2010-01-01', INTERVAL n.id -1 DAY) <= '2010-03-01' ) x
    LEFT JOIN ENTRY e ON DATE(e.datetime) = x.dt
                     AND e.entryid = 85
     GROUP BY DATE(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 één enkele tabel, in plaats van één per gegevenstype.




  1. Threads gebruiken om databaseverzoeken te doen

  2. De exacte waarde vinden van een door komma's gescheiden tekenreeks in PHP MySQL

  3. Juiste query om het huidige aantal verbindingen in een PostgreSQL DB te krijgen

  4. hoe het eerste of (een) element van een LiveData-lijst in Android MVVM-architectuur te krijgen?