выберите данные с помощью MySQL - PullRequest
2 голосов
/ 13 мая 2011

например, если у меня есть такая таблица

total   date
10      2010-01-01
15      2010-01-02
98      2010-01-03
50      2010-01-05

как мне написать оператор выбора, чтобы получить такой вывод?

total   date
10      2010-01-01
15      2010-01-02
98      2010-01-03
0       2010-01-04
50      2010-01-05

1 Ответ

1 голос
/ 13 мая 2011

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)
    

    ... для столько значений, сколько вам нужно. В этом случае оператор INSERT должен выполняться не менее 31 раза.

  3. Используйте DATE_ADD , чтобы составить список дней, увеличивая на основе значения NUMBERS.id:

    SELECT x.dt
      FROM (SELECT DATE(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-01-05' ) x
    
  4. Используйте OUTER JOIN для получения желаемого результата:

       SELECT x.dt,
              COUNT(*) AS total
         FROM (SELECT DATE(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-01-05' ) x
    LEFT JOIN YOUR_TABLE y ON y.date = x.dt
     GROUP BY x.dt
     ORDER BY x.dt
    

Почему числа, а не даты?

Простой - даты могут быть сгенерированы на основе числа, как в примере, который я предоставил. Это также означает использование одной таблицы, скажем, по одной для каждого типа данных.

...