Willkommen in der Webstatt Zum Webstatt Blog und Stories
Dustwolf Dustwolf am 24.07.06 21: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 Franky 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 Benutzung 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.

netcup.de Warum gibt es hier Werbung?
milahu milahu am 24.07.06 22:12

Good old DSP.. :)

PS: Minuspunkte auf Märchenonklerei und Titelwahl :P

Dustwolf Dustwolf am 24.07.06 22:43

Danke, soweit.

Aber Märchenonklerei? :D

Kevz am 24.07.06 23: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.

Dustwolf Dustwolf am 24.07.06 23: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???

Kevz am 25.07.06 06: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 :D

Franky Franky am 25.07.06 09: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 Benutzer von http://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()'));
if($userdayzeile == 0){
mysql_query('INSERT INTO user2counter SET datum = NOW(), userid='.$userid.', gaeste = 0');
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'));
if($userindb == 0){
mysql_query('UPDATE user2counter SET gaeste = gaeste + 1 WHERE userid='.$userid.' && datum = NOW()');
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');


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()'));
list($gestern) = mysql_fetch_array(mysql_query('SELECT gaeste FROM user2counter WHERE userid='.$userid.' && datum = NOW() - INTERVAL 1 DAY'));
list($online) = mysql_fetch_array(mysql_query('SELECT COUNT(userid) FROM user2counteron WHERE userid='.$userid.' && uhrzeit >= NOW() - INTERVAL '.$timeout.' SECOND'));


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

Michael Michael am 25.07.06 11:30

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

Kevz am 25.07.06 14:58

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

Dustwolf Dustwolf am 25.07.06 18:02

Auf zur nächsten Runde. :D
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.

milahu milahu am 25.07.06 18:08

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

Dustwolf Dustwolf am 25.07.06 18: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.

Michael Michael am 25.07.06 20:16

Quote
Original von milahu
Muss das denn wirklich alles in SQL berechnet werden..? IMHO: Nö. ;)


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

milahu milahu am 25.07.06 20:27

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

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.. ;)

Michael Michael am 25.07.06 20: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 M:D

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.

Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt