2009-08-02 7 views
3

Je stocke un horodatage dans une table mysql chaque fois que quelqu'un visite le site pour la première fois.Afficher le nombre de visites dans les 24 dernières heures, réparties par heure

Je serpentent avec des données qui ressemble à ceci:

2009-08-02 04:08:27 
2009-08-02 04:07:47 
2009-08-02 05:58:13 
2009-08-02 06:28:23 
2009-08-02 06:34:22 
2009-08-02 08:23:21 
2009-08-02 09:38:56 

Qu'est-ce que Im vouloir faire avec ces données est de créer un nombre de visites qui tombent dans chaque heure. Donc, dans l'exemple ci-dessus j'arriverais à la 4ème heure ayant 2 visites, la 5ème heure = 1, 6ème heure 2, 8ème heure 1 etc.

Je pensais que la meilleure manière de faire ceci, serait de faire un déclaration comme ça:

// a 24 hour loop 
for($i = 24; $i > -1; $i--) { 

    // the query for each hour 
    $sql = 'SELECT * FROM visits WHERE (DATE(added) = DATE_SUB(CURRENT_DATE(), INTERVAL ' . $i . ' HOUR))' 

$res = mysql_query($sql); 
$count = mysql_num_rows($res); 


    // store the number of rows for this loop in the array 
    $visits[] = $count; 
} 

Cela semble logique pour moi ... mais pour une raison quelconque ... son ne fonctionne certainement pas.

Comment voulez-vous faire cela?

Répondre

2

Qu'en est-il de le faire dans une seule requête, en utilisant une clause group by?

Quelque chose comme cela ferait sans doute:

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) 

(bien sûr, vous pourriez avoir besoin d'adapter certaines choses, comme les dates)

Il ferait votre travail de serveur DB plus pour que requête que pour les autres votre proposition ... Mais une seule requête, et non 24 - ce qui est une bonne chose. De l'autre côté, vous auriez moins de données allant du serveur de base de données vers le serveur PHP; ce qui est génial, surtout si la table est grande! Ensuite, du côté PHP, vous devrez "reconstruire" la date complète, car cette requête ne vous donnera que les heures.

+0

Je voulais juste ajouter, un petit problème avec la méthode ci-dessus par rapport à ce que je faisais est que je crée 2 tableaux. 1 avec les noms des heures, 1 avec le nombre de visites dans cette heure. En utilisant la méthode ici Pascal, je reçois des heures manquantes s'il n'y avait pas de visites à l'heure comme ça: "12AM", "01AM", "04AM", "05AM", "07AM", "08AM", " 09:00 "," 11:00 "," 12PM "," 02PM "," 03PM "," 04PM "," 05PM "," 07PM "," 20PM "," 21PM "," 22H " et visites : 10,1,19,3,1,3,1,3,10,1,1,3,1,6,1,2,2,4 Donc, il y a 18 je pense sortir, ce qui signifie 4 heures sur 24 n'ont eu aucune visite. Idéalement, je voudrais récupérer le compte 0 pour les heures vides – willdanceforfun

+0

Un truc que je faisais pour ce problème particulier était de créer une table heures, qui contient des valeurs de 0 à 23, puis externe rejoindre la requête avec cette table pour remplir les blancs. C'est un petit truc sale, mais ça marche plutôt bien. – OmerGertel

+0

@OmerGertel: ce serait une solution; mais il serait peut-être mieux de parler des résultats en PHP et d'ajouter les "heures manquantes" (ouais, ça veut dire un peu de code PHP pour "patcher" le resulset avant de l'utiliser, je l'avoue) –

6

Que diriez-vous:

SELECT hour(added), count(*) 
FROM visits 
WHERE added >= CURRENT_DATE()-1 
GROUP BY hour(added) 

Hour(time): «Renvoie l'heure pour le temps La plage de la valeur de retour est 0 à 23 pour les valeurs de temps de jour »,

Questions connexes