Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL Count данни за последните 7 дни

MySQL няма рекурсивна функционалност, така че ви остава да използвате трика с таблицата NUMBERS -

  1. Създайте таблица, която съдържа само увеличаващи се числа - лесно се прави с помощта на 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. Попълнете таблицата с помощта на:

    INSERT INTO NUMBERS
      (id)
    VALUES
      (NULL)
    

    ...за толкова стойности, колкото са ви необходими.

  3. Използвайте DATE_ADD за да съставите списък с дати, увеличавайки дните въз основа на стойността NUMBERS.id. Заменете „2010-01-01“ и „2010-01-02“ със съответните начална и крайна дата (но използвайте същия формат, ГГГГ-ММ-ДД ЧЧ:ММ:СС). В този пример извадих стойността NUMBERS.id от CURRENT_DATE, за да получа списък с последователни стойности на дата за последната седмица -

    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 към вашата таблица с данни въз основа на частта за дата и час.

       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
    

Защо числа, а не дати?

Просто - датите могат да бъдат генерирани въз основа на числото, както в примера, който предоставих. Това също означава използване на една таблица, вместо да кажем по една за тип данни.

По-рано:

  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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Структура на данните за различни видове турнири/състезания (лига, стълбичка, единична/двойна елиминация и др.)

  2. Doctrine2.3 и каскадата OneToOne продължават да не работят

  3. МАЧИ СРЕЩУ с множество колони в MySQL

  4. Има ли ограничения за дължината на низа в mysql?

  5. MySQL, json, JSON_ARRAY_APPEND - защо append няма да работи на 5.7.13?