например, если у меня есть такая таблица
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
MySQL не имеет рекурсивной функциональности, поэтому вам остается использовать NUMBERS табличный трюк -
NUMBERS
Создать таблицу, содержащую только инкрементные числа - это легко сделать с помощью 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;
Заполните таблицу, используя:
INSERT INTO NUMBERS (id) VALUES (NULL)
... для столько значений, сколько вам нужно. В этом случае оператор INSERT должен выполняться не менее 31 раза.
Используйте DATE_ADD , чтобы составить список дней, увеличивая на основе значения NUMBERS.id:
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
Используйте 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
Простой - даты могут быть сгенерированы на основе числа, как в примере, который я предоставил. Это также означает использование одной таблицы, скажем, по одной для каждого типа данных.