2009-07-30 7 views
0

Ich habe eine Tabelle mit der Anzahl der Seitenaufrufe pro Tag. Etwas wie folgt aus:MySQL/PHP: Datumsfunktionen für die Seitenstatistik und Popularität

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

Ich brauche eine Funktion zu erstellen, die die Gesamt-Hits zwischen den letzten zwei Wochen und erhalten die porcentage Änderungs vergleicht (Popularität).

Wenn die erste Woche habe ich 1000 Hits und die zweite Woche 2000 Hits Ich habe + 200% der Popularität

[(1000 * 2000)/100] = 200

Wenn die erste Woche habe ich mehr Hits als in der zweiten Woche die Popularität in minus (-80% zum Beispiel) wird

ich habe einige Fragen:

1) ich verwende die richtige mathematische Formel ??

2) Wie wähle ich in den letzten zwei Wochen in MySQL?

3) Es ist möglich, dass die erste Woche Hits haben, aber die zweite Woche überhaupt keine Hits, daher ist die Tabellenzeile für diese Daten oder jene spezifischen Tage leer, an denen es keine Treffer gab. Ist das ein Problem?

4) Ich bin sicher, es gibt einen besseren Weg für diese Art von Statistiken .. Einige bessere Ideen ????

Antwort

1

Verwenden Sie diese:

<?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

Das funktioniert, Danke !!! Aber was, wenn ich die Summe der Treffer von gestern und nicht von heute bekommen möchte. Ich meine, zähle zwei Wochen von gestern und nicht von heute. Ich ersetzte "<= Datum" durch "DATE_SUB (Datum, INTERVALL 1 Tag)", aber es funktioniert nicht richtig ... Ich bekomme die erste Woche Treffer richtig, aber dann in der zweiten Woche die Funktion dauert einen Tag von der anderen Woche .... Wie kann ich das beheben ?? – Jonathan

+0

der einfache Weg ist das Ändern aller "DATE_SUB (CURDATE(), INTERVAL ..." mit: "DATE_SUB (DATE_SUB (CURDATE(), INTERVALL 1 Tag), INTERVAL ..." :) Viel Glück! – inakiabt

2

1) Nicht ganz. Ich denke du willst die prozentuale Veränderung. Von 1000 Treffern zu 2000 Treffern ist ein Anstieg von 100%, nicht 200%. Sie wollen ((2000 - 1000)/100); vor

2) Zwei Wochen: SELECT SUM(hits) as s FROM tbl WHERE date>=NOW() - INTERVAL 2 WEEK AND date<NOW()-INTERVAL 1 WEEK

vor einer Woche: SELECT SUM(hits) as s FROM tbl WHERE date>=NOW()-INTERVAL 1 WEEK

3) Nicht mit der Abfrage oben. Irgendwelche Datenlücken werden einfach nicht Teil der SUM() sein.

4) Diese Methode scheint mir ziemlich gut zu sein. Es sollte die Arbeit erledigen.

+0

mit dieser Abfrage bekomme ich die Treffer Summe der insgesamt zwei Wochen ..Ich brauche die Summe der ersten Woche und dann die Summe der zweiten Woche. Ich muss für jede Woche zwei Abfragen verwenden, oder es gibt eine bessere Methode? – Jonathan

+0

Oh, ich verstehe. Ich würde definitiv zwei Abfragen verwenden. Ich werde es ein wenig bearbeiten. – zombat

0

Wenn die erste Woche habe ich 1000 Hits und die zweite Woche 2000 Hits Ich habe + 200% der Popularität

Sicher in diesem Fall, dass Sie eine Steigerung von 100%?

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

so dass Sie wollen

 
[ (2000/1000) * 100 ] = 200 

Möglicherweise können Sie eine Abfrage in etwa so (ungetestet so wahrscheinlich falsch) schreiben:

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 

obwohl, dass jeder eine Woche würde

+0

Die Frage ist nicht, wie man zwischen Variablen subtrahiert, aber wie man die Informationen von der Datenbank holt und eine bessere Weise, es zu tun ... – Jonathan

+0

was? Frage 1 lautet: "Ich verwende die richtige mathematische Formel?" –

+0

Ah in Ordnung ... Ich habe nicht den "so yoy will [(2000/1000) * 100] = 200" -Teil bekommen ... danke! – Jonathan

Verwandte Themen