¿Cómo get datos de la última hora, el último día y el último mes con una consulta?

Estoy registrando consultas que se han enviado a mi API de esta manera:

id | timestamp ----+--------------------- 1 | 2015-01-19 18:01:47 2 | 2015-01-19 20:41:37 3 | 2015-01-20 14:15:06 4 | 2015-01-21 13:02:51 5 | 2015-01-23 05:02:12 

Ahora, necesito saber cuántas consultas se han realizado en los últimos 60 minutos, 24 horas y 30 días y agruparlo así:

 HOURLY | DAILY | MONTHLY -------+-------+-------- 0 | 1 | 5 

¿Es esto posible de hacer en una consulta?

Editar:

He usado las sugerencias de aquí y jugué un poco con las cosas lógicas hasta que funcionó de la manera que quiero.

 SELECT SUM(CASE WHEN DATE_SUB(NOW(), interval 1 HOUR) <= `TIMESTAMP` THEN 1 ELSE 0 END) HOURLY, SUM(CASE WHEN DATE_SUB(NOW(), interval 1 DAY) <= `TIMESTAMP` THEN 1 ELSE 0 END) DAILY, SUM(CASE WHEN DATE_SUB(NOW(), interval 1 MONTH) <= `TIMESTAMP` THEN 1 ELSE 0 END) MONTHLY FROM `REQUESTS`; 

¡Muchas gracias por su ayuda muchachos!

 select sum(case when timestamp between now() - interval 1 hour and now() then 1 else 0) hourly, sum(case when timestamp between now() - interval 1 day and now() then 1 else 0) daily, sum(case when timestamp between now() - interval 1 month and now() then 1 else 0) monthly from your_table 

editado …

 select sum(timestamp >= now() - interval 1 hour) as hour, sum(timestamp >= now() - interval 1 day) as day, sum(timestamp >= now() - interval 1 month) as month from your_table 

Demostración de SQLFiddle

Otro buen truco que puede usar aquí es la function SUM() con solo una expresión booleana dentro de ella. Cuando lo haga, MySQL contará efectivamente el número de filas que cumplen con la condición. Entonces, usando algo como:

 SUM(timeCol >= (NOW() - INTERVAL 1 HOUR)) 

Solo contará el número de filas que tienen una timestamp dentro de la última hora. Prueba esta consulta:

 SELECT SUM(timecol >= (NOW() - INTERVAL 1 HOUR)) AS hourly, SUM(timeCol >= (NOW() - INTERVAL 1 DAY)) AS daily, SUM(timeCol >= (NOW() - INTERVAL 1 MONTH)) AS monthly FROM myTable; 

Me funcionó en SQL Fiddle .

EDITAR

La solución anterior no funciona si su tabla tiene dates futuras, por lo que si desea asegurarse de que solo obtiene valores en la última hora, día o mes, que no excedan la hora actual, simplemente agregue una donde cláusula:

 SELECT SUM(timecol >= (NOW() - INTERVAL 1 HOUR)) AS hourly, SUM(timeCol >= (NOW() - INTERVAL 1 DAY)) AS daily, SUM(timeCol >= (NOW() - INTERVAL 1 MONTH)) AS monthly FROM myTable WHERE timeCol <= NOW(); 

Aquí hay un Fiddle actualizado, que tiene un logging inválido para mostrar que funciona.