Unfortunately, MySQL not able to generate a rowset of a given number of rows.
You can create a helper table:
CREATE TABLE t_day (day INT NOT NULL PRIMARY KEY) INSERT INTO t_day (day) VALUES (1), (2), …, (31)
and use it in JOIN :
SELECT day, COUNT(*) FROM t_day JOIN p_community e ON day BETWEEN DATE(e.start) AND IF(DATE(e.end), DATE(e.end), DATE(e.start)) GROUP BY day
Or you can use the ugly subquery:
SELECT day, COUNT(*) FROM ( SELECT 1 AS day UNION ALL SELECT 2 AS day … UNION ALL SELECT 31 AS day ) t_day JOIN p_community e ON day BETWEEN DATE(e.start) AND IF(DATE(e.end), DATE(e.end), DATE(e.start)) GROUP BY day
source share