что делать в одном запросе, используя предложение group by?
Что-то вроде этого, вероятно, подойдет:
select HOUR(added), count(*) as nbr
from visits
where added between '2009-07-14' and '2009-07-15'
group by HOUR(added)
order by HOUR(added)
(конечно, вам может понадобиться адаптировать некоторые вещи, например даты)
Это заставит ваш сервер БД работать больше для этого запроса, чем для других, предложенных вами ... Но только один запрос, а не 24 - что хорошо.
С другой стороны, у вас будет меньше данных, идущих с сервера БД на сервер PHP; что здорово, особенно если стол большой!
Затем, на стороне PHP, вам нужно будет "восстановить" полную дату, так как этот запрос даст вам только часы.