java
SELECT DATA.DAY,
IFNULL(DATA.count, 0) AS cnt,
day_list.DAY AS DATE
FROM
(
SELECT
@DATE := DATE_ADD(@DATE, INTERVAL - 1 DAY) DAY
FROM
(SELECT @DATE := DATE_ADD(CURDATE(), INTERVAL 1 DAY) FROM student) days
LIMIT 30
) day_list
LEFT JOIN (SELECT DATE_FORMAT(birth_day, '%Y-%m-%d') DAY, count(id) count FROM student GROUP BY DAY) DATA
ON day_list.DAY = DATA.DAY
结果

这部分是从student表中,取出30条数据,并将日期+1赋值给@DATE变量
java
(SELECT @DATE := DATE_ADD(CURDATE(), INTERVAL 1 DAY) FROM student) days
LIMIT 30
这部分是将@DATE日期-1,并赋值给@DATE,下一次继续-1,赋值给@DATE,直到计算 出30天日期
java
SELECT
@DATE := DATE_ADD(@DATE, INTERVAL - 1 DAY) DAY

这部分是统计同一天出生的学生
java
SELECT DATE_FORMAT(birth_day, '%Y-%m-%d') DAY, count(id) count FROM student GROUP BY DAY
所以整个整体就能将30天内同一天出生的学生人数统计出来
这个方案有个缺点,要求student表要超过30条,否则计算出的数据会缺少