2009-07-30 6 views
0

J'ai un tableau avec le nombre de pages vues par jour. Quelque chose comme ceci:MySQL/PHP: Fonctions de date pour les statistiques d'affichage de page et la popularité

+------+------------+------+ 
| id | date  | hits | 
+------+------------+------+ 
| 4876 | 2009-07-14 | 4362 | 
+------+------------+------+ 
| 4876 | 2009-07-15 | 1324 | 
+------+------------+------+ 
| 7653 | 2009-06-09 | 5643 | 
+------+------------+------+ 

Je dois créer une fonction qui compare les coups au total entre deux dernières semaines et obtenir le porcentage du changement (popularité).

Si la première semaine, j'ai 1000 hits et la deuxième semaine 2000 visites je + 200% de popularité

[(1000 * 2000)/100] = 200

Si la première semaine, j'ai plus de succès que dans la deuxième semaine de la popularité sera en moins (-80% par exemple)

J'ai quelques questions:

1) Je suis en utilisant la formule mathématique correcte ??

2) Comment sélectionner MySQL dans les deux dernières semaines?

3) Il est possible que la première semaine, nous avons des hits, mais la deuxième semaine aucun hits du tout, donc la ligne du tableau sera vide pour ces dates ou ces jours précis qu'il n'y a pas eu de hits.

4) Je suis sûr qu'il y a une meilleure façon de faire ce genre de statistiques .. Quelques meilleures idées ????

Répondre

1

Utiliser ceci:

<?php 
function fetch($sql) 
{ 
    $query = mysql_query($sql); 
    return mysql_fetch_assoc($query); 
} 

function calculate($week1, $week2) 
{ 
    if ($week1 == 0) 
    { 
     $week1 = 1; 
    } 
    return ($week2/$week1) * 100; 
} 

$q1 = "SELECT SUM(hits) as hits FROM table WHERE DATE_SUB(CURDATE(),INTERVAL 1 week) <= date"; 
$first_week_hits = fetch($q1); 

$q2 = "SELECT SUM(hits) as hits FROM table WHERE DATE_SUB(CURDATE(),INTERVAL 2 week) <= date"; 
$second_week_hits = fetch($q2); 

$percent = $str_percent = calculate($first_week_hits['hits'], $second_week_hits['hits']); 
if ($percent > 0) 
{ 
    $str_percent = '+'.$percent; // :) 
} 
echo "I have ".$str_percent."% of popularity"; 
?> 
+0

Cela fonctionne, merci !!! Mais que faire si je veux obtenir la somme des hits à partir d'hier et non d'aujourd'hui. Je veux dire, comptez deux semaines d'hier et non d'aujourd'hui. J'ai remplacé "<= date" par "DATE_SUB (date, INTERVAL 1 jour)" mais cela ne fonctionne pas correctement ... Je reçois la première semaine correctement, mais la deuxième semaine, la fonction prend un jour de l'autre semaine .... Comment puis-je réparer cela?? – Jonathan

+0

la façon simple est de changer tous "DATE_SUB (CURDATE(), INTERVAL ..." avec: "DATE_SUB (DATE_SUB (CURDATE(), INTERVAL 1 jour), INTERVAL ..." :) bonne chance! – inakiabt

2

1) Pas tout à fait. Je pense que vous voulez le changement en pourcentage. Passer de 1000 hits à 2000 hits est une augmentation de 100%, pas de 200%. Vous voulez ((2000 - 1000)/100);

2) il y a deux semaines: SELECT SUM(hits) as s FROM tbl WHERE date>=NOW() - INTERVAL 2 WEEK AND date<NOW()-INTERVAL 1 WEEK

il y a une semaine: SELECT SUM(hits) as s FROM tbl WHERE date>=NOW()-INTERVAL 1 WEEK

3) Non à la requête ci-dessus. Tout écart de date ne fera tout simplement pas partie du SUM().

4) Cette méthode me semble plutôt bonne. Cela devrait faire le travail.

+0

avec cette requête, je reçois la somme des hits du total de deux semaines ..J'ai besoin de la somme de la première semaine et de la somme de la deuxième semaine. J'ai besoin d'utiliser deux requêtes pour chaque semaine ou il y a une meilleure méthode? – Jonathan

+0

Oh, je vois. J'utiliserais certainement deux requêtes. Je vais l'éditer un peu. – zombat

0

Si la première semaine, j'ai 1000 hits et la deuxième semaine 2000 visites j'ai + 200% popularité

Certes, dans ce cas, vous avez une augmentation de 100%?

 
changeInHits = hitsThisMonth - hitsLastMonth 
changeAsPercentageOfLastMonth = 100 x changeInHits/hitsLastMonth 

si vous voulez

 
[ (2000/1000) * 100 ] = 200 

Vous pourriez être en mesure d'écrire un quelque chose de requête comme ceci (non testé donc probablement mal):

SELECT YEARWEEK(date) as weekno, sum(hits) as thisweek, 
    (SELECT SUM(hits) FROM table WHERE YEARWEEK(date) = weekno - 1) as lastweek, 
    IF (lastweek > 0, thisweek/lastweek * 100, 0) as increase 
FROM table 
GROUP BY weekno 

bien que ce serait tout un semaine

+0

La question n'est pas comment soustraire entre les variables, mais comment obtenir les informations de la base de données et une meilleure façon de le faire ... – Jonathan

+0

quoi? La question 1 est "J'utilise la bonne formule mathématique?" –

+0

Ah d'accord ... Je n'ai pas eu le "so you want [(2000/1000) * 100] = 200" partie ... merci! – Jonathan

Questions connexes