Ну в лоб так, если взять последние 7 дней у которых есть посты то
SELECT DATE_FORMAT(`date`, '%Y-%m-%d') AS my_date, count(id) FROM posts GROUP BY my_date ORDER BY `date` DESC LIMIT 7
а если взять 7 дней с учетом, что в какой то день не было постов, то как то так
select DATE_FORMAT(`date`, '%Y-%m-%d') AS my_date, count(id) FROM posts WHERE my_date IN (
DATE_FORMAT(NOW(), '%Y-%m-%d'),
DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP(NOW()) - 1 * 24 * 60 * 60), '%Y-%m-%d'),
DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP(NOW()) - 2 * 24 * 60 * 60), '%Y-%m-%d'),
DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP(NOW()) - 3 * 24 * 60 * 60), '%Y-%m-%d'),
DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP(NOW()) - 4 * 24 * 60 * 60), '%Y-%m-%d'),
DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP(NOW()) - 5 * 24 * 60 * 60), '%Y-%m-%d'),
DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP(NOW()) - 6 * 24 * 60 * 60), '%Y-%m-%d')
) GROUP BY my_date