SQL est notoirement mauvais pour renvoyer des données qui ne sont pas dans la base de données. Vous pouvez trouver les valeurs de début et de fin pour les écarts de dates, mais obtenir toutes les dates est difficile.
La solution consiste à créer une table de calendrier avec un enregistrement pour chaque date et OUTER JOIN à votre requête.
Voici un exemple en supposant que created_at est de type DATE :
SELECT calendar_date, COUNT(`id`)
FROM calendar LEFT OUTER JOIN my_table ON calendar.calendar_date = my_table.created_at
GROUP BY calendar_date
(Je suppose que created_at est vraiment DATETIME, vous devrez donc faire un peu plus de gymnastique pour REJOINDRE les tables).