2010-04-20 6 views
3

J'essaie de calculer les résultats par heure à partir d'une base de données. Les données sont stockées essentiellement comme suit:Liste des visites par heure à partir d'une table MySQL

Table Name: Visitors 
============================ 
VisitorIP   TIMESTAMP 
---------------------------- 
15.215.65.65  123456789 

Je veux afficher au total par heure coups (au cours des 6 dernières heures), y compris les heures qui a malheureusement pas de résultats. Exemple de sortie:

// Assuming now : 21:00 
21:00 - 0 hits 
20:00 - 1 hits 
19:00 - 4 hits 
18:00 - 0 hits 
17:00 - 2 hits 
16:00 - 3 hits 

j'aimerais obtenir les données en tant que tableau, S'il vous plaît noter que la date stockée est au format de l'horodatage UNIX. et il peut y avoir quelques heures sans aucun succès!

Merci

+0

La sortie doit-elle inclure l'heure incomplète actuelle ou devrait-elle commencer à partir de la première heure complète? –

+0

@Mark Oui à partir de l'heure incomplète actuelle. merci – Ryan

Répondre

3

Vous pouvez utiliser le mot clé simple BETWEEN pour cela. Vous pouvez décrire datetime est entre les valeurs que vous souhaitez sélectionner (plage 3600 secondes).

SELECT * FROM VISITORS WHERE TIMESTAMP BETWEEN UNIX_TIMESTAMP()-3600*1 AND UNIX_TIMESTAMP()-3600*0; 
SELECT * FROM VISITORS WHERE TIMESTAMP BETWEEN UNIX_TIMESTAMP()-3600*2 AND UNIX_TIMESTAMP()-3600*1; 
SELECT * FROM VISITORS WHERE TIMESTAMP BETWEEN UNIX_TIMESTAMP()-3600*3 AND UNIX_TIMESTAMP()-3600*2; 
SELECT * FROM VISITORS WHERE TIMESTAMP BETWEEN UNIX_TIMESTAMP()-3600*4 AND UNIX_TIMESTAMP()-3600*3; 
SELECT * FROM VISITORS WHERE TIMESTAMP BETWEEN UNIX_TIMESTAMP()-3600*5 AND UNIX_TIMESTAMP()-3600*4; 
SELECT * FROM VISITORS WHERE TIMESTAMP BETWEEN UNIX_TIMESTAMP()-3600*6 AND UNIX_TIMESTAMP()-3600*5; 
+3

Votre solution fonctionne techniquement, mais si le chef d'Axel décide que le rapport devrait maintenant inclure les 72 dernières heures? –

+0

puis utilisez uniquement la première ligne et changez 3600 à 72 * 60 * 60 – Svisstack

4
SELECT MONTH(timestamp),DAY(timestamp), HOUR(timestamp),count(*) 
from visitors 
    group by MONTH(timestamp), DAY(timestamp), HOUR(timestamp) 

en php vous devez tenir compte de tous les trous dans les données des heures manquantes.

+0

+1 pour une solution simple et générale. –

0

juste simplifiée réponse ci-dessus,

for($i=1;$i<=6;$i++){ 
    $s -= $i;  
    $query[$i] = "SELECT * FROM VISITORS WHERE TIMESTAMP BETWEEN UNIX_TIMESTAMP()-3600*$i AND UNIX_TIMESTAMP()-3600*$s"; 
} 

$i = 1; 
foreach($query as $value){ 
    $result[$i] = mysql_fetch_row($query[$i]); 
    $i++; 
} 

juste mon idée simple. n'hésitez pas à utiliser.

Questions connexes