Допустим, есть таблица с событиями, которые наступили в определенную дату. Нужно выяснить, сколько событий было за каждый день из заданного интервала?
Можно решить эту задачу на языках программирования, также можно на MySQL с помощью процедур. Но можно обойтись и вовсе без программирования, просто составив нужный запрос. В центре этого запроса должен фигурировать список дат, чтобы MySQL вывел их и дал с ними работать. Короткой функции для этого нет, зато можно получить результат с помощью такого немного длинного запроса:
SELECT time_period.selected_date AS `Текущая дата` FROM (SELECT v.* FROM (SELECT ADDDATE('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) selected_date FROM (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t0, (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t1, (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t2, (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t3, (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t4) v WHERE selected_date BETWEEN '2015-01-01' AND '2015-03-31') AS time_period
Суть его в том, что выбираются разряды чисел: единицы, десятки, сотни, тысячи, десятки тысяч. Эти числа комбинируются между собой и образуют ряд от 0 до 99999. Каждое число этого ряда прибавляется в виде дня к дате начала времен ('1970-01-01') и выводится. В качестве фильтра, чтобы не выводилось совсем всё, используется WHERE вместе с BETWEEN.
В общем, после выполнения запроса выведутся все даты заданного диапазона. Далее их можно использовать для включения в конструкцию LEFT JOIN, и после группировки получить искомое число событий в заданный день (при желании не только день, но и месяц или другой период).