Webstatt.org - Community seit 2006 - 2012 (2024?)

Statistik speichern

Avatar user-168
24.07.2006 19:38

Ich habe für mein CMS momentan ein Statistiksystem (basierend auf einer Class), wo ich für den einzelnen Tag, die Wochentage, die Monate, die Jahre und so weiter einzeln die Werte abspeichere.

Also hab ich z.B. folgende Tabellen:
statistik_wochentage
Mit den Zeilen Montag, Dienstag, etc. und dem entsprechendem Wert.

Dann eine Tabelle
statistik_monat
Mit den Zeilen Januar, Februar, etc.



Allerdings hatte user-182 ja letztens auch eine Frage zu nem Counter wo dann Lösungen mit GROUP BY und ähnlichen Befehlen vorgeschlagen wurden.
Ich hab bisher eher simple Sachen mit MySQL umgesetzt und stelle mir momentan folgende Lösung vor.

Dass ich über den Feldtyp Date (bisher hab ich immer INT mit dem Timestamp benutzt) die Tage abspeichere und dann beispielsweise MySQL alle Einträge aus den Monaten Januar zusammenzählen lasse. So, dass MySQL mir dann den fertig addierten Wert ausgibt.

Ich habe keine Ahnung ob und wie ich das umsetzen könnte und bin daher auf der Suche nach einem wirklich guten Tutorial.
Auch was die user-129utzung von Feldtypen angeht und deren Eigenschaften und Funktionen.


Das offizielle Manual von MySQL und Seiten wie Schattenbaum meine ich nicht, dass ist mir alles bekannt. Ich suche eher ein Tutorial, dass mit Beispielen die Funktionen vorstellt und dabei nicht zu komplex wird.

Ich hoffe ihr habt verstanden, was ich meine.
Danke schonmal für alle Antworten.

Dustwolf ------------------------- Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein. F. Nietzsche
Avatar user-255
24.07.2006 20:12

Good old DSP.. lächeln

PS: Minuspunkte auf Märchenonklerei und Titelwahl frech

Those who can, do. Those who can't, teach. # Musik gehört dem Volk! # last.fm
Avatar user-168
24.07.2006 20:43

Danke, soweit.

Aber Märchenonklerei? Fettes Grinsen

Dustwolf ------------------------- Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein. F. Nietzsche
user-220
24.07.2006 21:09

Btw. wäre es nicht von vorteil wenn du eine Tabelle nutzt?
Diese Aktualisierst du halt immer und speicherst halt den timestamp, und machst dann halt einige Berechnungen via timestamp, mit den Wochentagen usw. usw.

Avatar user-168
24.07.2006 21:18

Um das ganze mal etwas konkreter zu gestalten:

Wenn ich also nun einfach eine Tabelle habe mit folgenden Feldern:

Datum (DATE)
Wert (INT)


Dann kann ich damit ja alles ausrechnen. Tag mit den meisten und wenigsten Aufrufen, monatliche Statistiken, Jahresvergleich und so weiter.
Dann bräuchte ich bloß für den Stundenvergleich noch ne zweite Tabelle, wo ich dann halt für alle 24 Stunden einen Eintrag anlege, oder kann ich das alles in eine Tabelle packen???

Dustwolf ------------------------- Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein. F. Nietzsche
user-220
25.07.2006 04:55

Yep, wenn du mit timestamp arbeitest - kannst du das alles mittels timestamp errechnen sozusagen. ggf. halt bearbeiten. Da brauchst du keine zusätzlichen Felder oder so, d.h. bei solchen dingen timestamp nutzen Fettes Grinsen

Avatar user-182
25.07.2006 07:52

Michael hatte früher im alten Jex mal ein Counter als Tutorial veröffentlicht:
--> http://jex-treme.de/forum/thread.php?threadid=18071

Trotzdem werden ich denk Gedanken einfach nicht los, dass da irgendetwas an dem Code falsch ist...ich habe den Code für die user-129utzer von www.h6p.de einwenig verändert:

CREATE TABLE `user2counter` (
`userid` int(11) NOT NULL default '0',
`datum` date NOT NULL default '0000-00-00',
`gaeste` int(11) NOT NULL default '0',
PRIMARY KEY (`userid`,`datum`)
) TYPE=MyISAM;

# und

CREATE TABLE `user2counteron` (
`userid` int(11) NOT NULL default '0',
`uhrzeit` datetime NOT NULL default '0000-00-00 00:00:00',
`ip` varchar(15) NOT NULL default '',
PRIMARY KEY (`userid`,`ip`)
) TYPE=MyISAM;


Und dann benutze ich den folgenden Code:


$userip = $_SERVER['REMOTE_ADDR'];
// [..]
// Counter
$timeout = 60*10; // nach 10 minuten netmehr online
$reload = 60*60*3; // nach 3 stunden als neuen user zaehlen

list($userdayzeile) = mysql_fetch_array(mysql_query('SELECT COUNT(userid) FROM user2counter WHERE userid = '.$userid.' && datum = NOW()'zwinkern);
if($userdayzeile == 0){
mysql_query('INSERT INTO user2counter SET datum = NOW(), userid='.$userid.', gaeste = 0'zwinkern;
mysql_query('DELETE FROM user2counteron WHERE userid='.$userid);
}
list($userindb) = mysql_fetch_array(mysql_query('SELECT COUNT(userid) FROM user2counteron WHERE ip = "'.$userip.'" && userid = '.$userid.' && uhrzeit > NOW() - INTERVAL '.$reload.' SECOND'zwinkern);
if($userindb == 0){
mysql_query('UPDATE user2counter SET gaeste = gaeste + 1 WHERE userid='.$userid.' && datum = NOW()'zwinkern;
mysql_query('INSERT INTO user2counteron SET ip = "'.$userip.'", uhrzeit = NOW(), userid='.$userid);
}else mysql_query('UPDATE user2counteron SET uhrzeit=NOW() WHERE ip = "'.$userip.'" && userid='.$userid);
mysql_query('DELETE FROM user2counteron WHERE uhrzeit <= NOW() - INTERVAL '.$reload.' SECOND'zwinkern;


Auslesen:
    // Counter
list($gesamt) = mysql_fetch_array(mysql_query('SELECT SUM(gaeste) FROM user2counter WHERE userid='.$userid));
list($heute) = mysql_fetch_array(mysql_query('SELECT gaeste FROM user2counter WHERE userid='.$userid.' && datum = NOW()'zwinkern);
list($gestern) = mysql_fetch_array(mysql_query('SELECT gaeste FROM user2counter WHERE userid='.$userid.' && datum = NOW() - INTERVAL 1 DAY'zwinkern);
list($online) = mysql_fetch_array(mysql_query('SELECT COUNT(userid) FROM user2counteron WHERE userid='.$userid.' && uhrzeit >= NOW() - INTERVAL '.$timeout.' SECOND'zwinkern);


Ihr müsst euch einfach die Sache mit `userid` (und $userid) wegdenken, wenn ihr den Counter "nur einmal" benutzt...

Seid ihr auch schon wix'r? xD
Avatar user-253
25.07.2006 09:30

Oh Gott was für Jugendsünden...

user-220
25.07.2006 12:58

Hrhr, tja die Sünden - suchen einen Heim höhö.

Avatar user-168
25.07.2006 16:02

Auf zur nächsten Runde. Fettes Grinsen
Und jetzt bin ich wirklich etwas überfordert.

Meine Tabelle:

ID - INT - auto_inc
Datum - DATE
Wert - INT

So far... Nun versuche ich schon die ganze Zeit eine einzige (maximal 2) Abfragen zu schreiben, die mir die Daten so in ein Array packt, dass ich damit ganz einfach folgende Tabelle aufmachen kann:

-------- Jan Feb Mär Apr Mai Jun Jul Aug Sep Okt Nov Dez
2005
2006
2007

Und am Ende jeder Spalte und Zeile soll dann auch noch ein Tabellenfeld mit absoluter und prozentualer Addition der darüber und davor stehenden Werte stehen.
Vielleicht kennt wer die Konstruktion auch als "erweiterte" Vier-Felder-Tafel, wie man das z.B. zum Thema Stochastik macht.

Dustwolf ------------------------- Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein. F. Nietzsche
Avatar user-255
25.07.2006 16:08

Muss das denn wirklich alles in SQL berechnet werden..? IMHO: Nö. zwinkern

Those who can, do. Those who can't, teach. # Musik gehört dem Volk! # last.fm
Avatar user-168
25.07.2006 16:16

Sicher nicht, aber das würd es einfacher machen.
Auf lange Sicht hin kann ich mich schon nicht drauf festlegen, wie ich die Daten auslese... Naja, ich werd noch ein bisschen rumprobieren.

Dustwolf ------------------------- Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein. F. Nietzsche
Avatar user-253
25.07.2006 18:16

Original von user-255
Muss das denn wirklich alles in SQL berechnet werden..? IMHO: Nö. zwinkern


Mittlerweile finde ich, dass man dies nicht pauschal beantworten kann. Auf der einen Seite hat es enorme Vorteile, wenn Einzeldaten vorliegen und sie so immer wieder neu auswertbar sind. Auf der anderen Seite wird insbesondere bei großen Datensätzen die Auswetung immer aufwendiger...

Ich bevorzuge eine hybrid Lösung: Die Daten werden als Einzeldaten gespeichert, allerdings werden nach einem gewissen Zeitintervall bestimmte Berichte generiert. Es wird also nur der aktuelle Datensatz wirklich aus "live" generiert. Bei großen Seiten könnte man sogar nur auf solche generierten Berichte zurückgreifen.
Weiterhin ist es natürlich ein absolutes Muss die Tabelle aufzuräumen, also ältere Datensätze in eigene Archivtabellen zu verschieben (beispielsweise für jeden vergangenen Monat); so bleibt die Menge an Daten und die benötigte Zeit überschaubar.

Michael

Avatar user-255
25.07.2006 18:27

Michael, ich habe mich vorher eher auf die Auswertung der Daten bezogen.. aber okay zwinkern

Es sollte möglichst nicht in eine unnötige Datenflut ausarten, die dann an der Performance nagt.

Bei kleinen Seiten sollte man sich aber nicht allzu viele Sorgen machen.. zwinkern

Those who can, do. Those who can't, teach. # Musik gehört dem Volk! # last.fm
Avatar user-253
25.07.2006 18:34

OK dann habe ich dich falsch verstanden, es hängt aber auch ein weng zusammen =)
Bei Verwendung von DATE(-TIME) plädiere ich ganz entschieden für eine Berechnung in MySQL (wenn nicht gecacht). Bei Timestamps plädiere ich für eine Umsetzung mit DATETIME MFettes Grinsen

Die Verhältnismäßigkeit der Mittel sollte man immer im Hintergrund haben -da hast du vollkommen recht. Für eine kleine private Seite brauche ich mir darüber keine Gedanken machen. Aber bei größeren lohnt es sich auf jeden Fall - besonders bei Auftragsabreiten, wenn beispielsweise dem Kunden nach einigen Monaten auffältt, dass er doch gerne auch die Statistik xy hätte und zwar nicht erst ab jetzt.