Hourly Set Report in MySQL
What your query does, is putting the COUNT() in the column you want, but it actually counts every row. There's only one condition, where COUNT() distinguishes between "to count" or "not to count". And that is, that when you COUNT(*) every row is counted, no matter what. When you COUNT(column_name), it counts only the rows that are not NULL. But that just aside.

What you actually want to do is this:

SUM(IF((HOUR(comments.date)) = '9', 1, 0)) AS `9-10`,


Another note:
When you do 

WHERE
DATE(comments.date) = DATE(NOW()) AND
MONTH(comments.date) = MONTH(NOW()) AND
YEAR(comments.date) = YEAR(NOW())


the comparison for month and year is unnecessary, since this is already covered in DATE().  

An even better way to do this is actually doing this:

WHERE comments.date BETWEEN CURDATE() AND CONCAT(CURDATE(), ' 23:59:59')


or 

WHERE comments.date &gt;= CURDATE() 
AND comments.date &lt; CURDATE() + INTERVAL 1 DAY


This is because MySQL can't use an index on a column (if there is any), when you use a function on this column.