You need to query year on grouping too, using WHERE a.year=DATE_FORMAT(d.date_entered, "%Y")
as extra condition at top select level.
select a.month, a.year, IFNULL(d.total, 0) AS total
from (
SELECT 'Apr' month, 2013 year, 1 monthOrder UNION
SELECT 'May' month, 2013 year, 2 monthOrder UNION
SELECT 'Jun' month, 2013 year, 3 monthOrder UNION
SELECT 'Jul' month, 2013 year, 4 monthOrder UNION
SELECT 'Aug' month, 2013 year, 5 monthOrder UNION
SELECT 'Sep' month, 2013 year, 6 monthOrder UNION
SELECT 'Oct' month, 2013 year, 7 monthOrder UNION
SELECT 'Nov' month, 2013 year, 8 monthOrder UNION
SELECT 'Dec' month, 2013 year, 9 monthOrder UNION
SELECT 'Jan' month, 2014 year, 10 monthOrder UNION
SELECT 'Feb' month, 2014 year, 11 monthOrder UNION
SELECT 'Mar' month, 2014 year, 12 monthOrder UNION
SELECT 'Apr' month, 2014 year, 13 monthOrder
) AS a left join (
SELECT date_entered, count(id) AS total
FROM leads AS b
WHERE user_id = 1
AND is_deleted = 0
AND date_entered BETWEEN "2013-04-29" AND "2014-04-29"
GROUP BY YEAR(b.date_entered), MONTH(b.date_entered)
) AS d on a.month = DATE_FORMAT(d.date_entered, "%b")
WHERE a.year=DATE_FORMAT(d.date_entered, "%Y") -- this added
ORDER BY a.monthOrder asc
Or use AND
instead of WHERE
, this should have the same effectm as proposed in comments. on a.month = DATE_FORMAT(d.date_entered, "%b") AND a.year=DATE_FORMAT(d.date_entered, "%Y")