You need to generate a calendar first and join it's rows with table session
through date
column. The subquery below will generate all 1 month based from the value set in the @START_DATE
variable.
SET @START_DATE = '2018-01-01'; -- set your starting date here
SELECT a.`DATE`,
COUNT(b.user) AS `COUNT`
FROM
(
SELECT DATE(cal.date) `DATE`
FROM (
SELECT @START_DATE + INTERVAL xc DAY AS date
FROM (
SELECT @xi:=@xi+1 as xc from
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) xc1,
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) xc2,
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) xc3,
(SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4) xc4,
(SELECT @xi:=-1) xc0
) xxc1
) cal
WHERE cal.date <= DATE_ADD(DATE_ADD(@START_DATE, INTERVAL 1 MONTH), INTERVAL -1 DAY)
) a
LEFT JOIN sessions b
ON a.`DATE` = b.`DATE`
GROUP BY a.`DATE`
ORDER BY a.`DATE`
Here's a Demo.
The subquery that generates date was borrowed from this article: Generating a Series of Dates in MySQL and modified a little bit to allow user to input the starting date.