Если у вас есть таблица календаря, то ваша проблема решена:
SELECT DATE(`date`) AS RegistrationDate, COUNT(u.id) AS NumberOfRegistrations
FROM Calendar c LEFT JOIN
Users u
ON DATE(u.date) = c.date
WHERE c.date >= '2018-05-01' AND c.date < '2018-05-14'
GROUP BY RegistrationDate;
Таблица Calendar
может быть очень полезна, и вы можете найти ее с помощью поиска Google.
Вы можете сделать что-то похожее с таблицей numbers
, если у вас есть один удобный.
Если их нет, вы можете сгенерировать нужные даты:
SELECT DATE(`date`) AS RegistrationDate, COUNT(u.id) AS NumberOfRegistrations
FROM (SELECT DATE('2018-05-01') as dte UNION ALL
DATE('2018-05-02') as dte UNION ALL
DATE('2018-05-03') as dte UNION ALL
DATE('2018-05-04') as dte UNION ALL
DATE('2018-05-05') as dte UNION ALL
DATE('2018-05-06') as dte UNION ALL
DATE('2018-05-07') as dte UNION ALL
DATE('2018-05-08') as dte UNION ALL
DATE('2018-05-09') as dte UNION ALL
DATE('2018-05-10') as dte UNION ALL
DATE('2018-05-11') as dte UNION ALL
DATE('2018-05-12') as dte UNION ALL
DATE('2018-05-13') as dte UNION ALL
DATE('2018-05-14') as dte
) c LEFT JOIN
Users u
ON DATE(u.date) = c.dte
WHERE c.dte >= '2018-05-01' AND c.dte < '2018-05-14'
GROUP BY RegistrationDate;
Примечания:
- Использовать стандартные форматы даты для дат ГГГГ-ММ-ДД.
- Стандартным разделителем строк в SQL является одинарная кавычка. Используйте его, если у вас нет веских причин использовать двойные кавычки.
- Не используйте
between
с датами. Неясно, намереваетесь ли вы включить 2018-05-13, но ваш запрос, вероятно, исключит любые данные на эту дату (из-за компонента времени).