WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   SQL-Query für Counter (http://www.wcm.at/forum/showthread.php?t=205149)

Potassium 07.12.2006 12:49

SQL-Query für Counter
 
Ich suche das SQL-Statement um die Anzahl an Einträgen von einem Tag zu bekommen.
Also der Tag an dem die meißten Benutzer online waren.
Tabelle:
Counter_ID (PK), Counter_Time, Counter_IP, Counter_Referer

ich denk das würde irgendwie mit SELECT MAX(Count_ID) WHERE und dann was mit BETWEEN aber wie genau weiß ich ned.
Counter_Time ist als Unixtimestamp angegeben.

pong 07.12.2006 12:53

select count(date (wo auch immer das Datum drinn sein mag)) as hits from was auch immer
group by date(wo auch immer das Datum drinn sein mag) order by hits;

pong

Potassium 07.12.2006 13:10

danke erstmal.
"wo auch immer das Datum drinn sein mag" ?
wie soll ich das verwirklichen?

pong 07.12.2006 18:07

Zitat:

wie soll ich das verwirklichen?
da bei dir die Daten schon zu bestehen scheinen, wirst du ja hoffentlich die Zeitpunkt der Counterauslösung in einem Datum+Zeit Format gespeichert haben von welchem du das Datum rauszuholen hast, schließlich wirst du ja kaum an einer Auswertung pro ms interessiert sein, oder?

pong

T.dot 08.12.2006 18:33

Keine Ahnung wie performant das ist, erste Lösung dir mir eingefallen ist:

Um zb. die Zugriffszahl für jeden Tag auszuwerten:
SELECT DATE_FORMAT( SpalteDatum, '%d.%m.%Y' ) , count( SpalteDatum )
FROM datumstabelle
GROUP BY DATE_FORMAT( SpalteDatum, '%d.%m.%Y' )
ORDER BY SpalteDatum

Wenn du für Stunde/Woche/Monat/Jahr/was-auch-immer auswerten willst, musst du den Pattern im Date_Format ändern, siehe hierzu:
http://dev.mysql.com/doc/refman/4.1/...functions.html

mfg T.

gorie 14.12.2006 11:38

Ich wäre für eine etwas kürzere Variante

"SELECT COUNT(*) c, SUBSTR(Counter_Time, 1,10) t ".
"FROM `tabelle` ".
"GROUP BY TO_DAYS(Counter_Time) ". "ORDER BY c ASC "

sofern Counter_Time als Datetime gespeichert ist, sonst bekommst für das substr nix richtiges

Potassium 14.12.2006 20:30

Das Datum ist als UNIX-Time stamp (int) gespeichert!

gorie 14.12.2006 22:51

Zitat:

Original geschrieben von Potassium
Das Datum ist als UNIX-Time stamp (int) gespeichert!
dann musst du einfach das SUBSTR(Counter_Time, 1,10) dementsprechend anpassen

klappt der Ausdruck ansonst?

iG0r 19.12.2006 14:14

habs mal kurz getestet, so klappt es mit unix timestamps:

PHP-Code:

$sql "SELECT COUNT(*) AS c FROM deine_tabelle GROUP BY DATE_SUB(FROM_UNIXTIME(dein_unix_timestamp,'%Y-%m-%d'),INTERVAL 1 DAY)"

zählt alle timestamps die am selben tag erstellt wurden, wie du es wolltest.

gorie 19.12.2006 14:45

Zitat:

Original geschrieben von iG0r
habs mal kurz getestet, so klappt es mit unix timestamps:

PHP-Code:

$sql "SELECT COUNT(*) AS c FROM deine_tabelle GROUP BY DATE_SUB(FROM_UNIXTIME(dein_unix_timestamp,'%Y-%m-%d'),INTERVAL 1 DAY)"

zählt alle timestamps die am selben tag erstellt wurden, wie du es wolltest.

tut das selbe wie mein ausruck... :)

iG0r 19.12.2006 15:03

Zitat:

Original geschrieben von gorie
tut das selbe wie mein ausruck... :)
dein query würde alles zählen, unabhängig vom tag der erstellung, da das datum ja in unix timestamp format vorliegt, und nicht formatiert in jahr-monat-tag etc.

mein query zählt tatsächlicht nur alle einträge mit einem timestamp, welche am selben tag erstellt wurden.

du kannst ja gerne beide testen, ich habs gemacht :p

gorie 19.12.2006 15:09

Zitat:

Original geschrieben von iG0r
dein query würde alles zählen, unabhängig vom tag der erstellung, da das datum ja in unix timestamp format vorliegt, und nicht formatiert in jahr-monat-tag etc.

mein query zählt tatsächlicht nur alle einträge mit einem timestamp, welche am selben tag erstellt wurden.

du kannst ja gerne beide testen, ich habs gemacht :p

sorry, hast natürlich recht... ich wusste nicht, dass to_days nicht für timestamps funktioniert, ich dachte das geht auch da :(
Jetzt bin ich wieder gescheider :)

Potassium 24.12.2006 18:49

hey leutz
danke für eure hilfe. bin leider erst heute dazugekommen das auszuprobieren.
irgendwie funktioniert das nicht richtig:
ich hab zb folgendes:
Code:

759        24 Dec 2006, 17:21        83.211.88.93       
758        24 Dec 2006, 15:26        80.109.118.82        fpdwl.roseflex.com
757        24 Dec 2006, 15:04        81.217.65.144        fpdwl.roseflex.com
756        24 Dec 2006, 15:01        195.3.113.168        www.wcm.at
755        24 Dec 2006, 15:01        65.55.209.134       
754        24 Dec 2006, 14:52        65.55.209.140       
753        24 Dec 2006, 14:29        65.55.209.143       
752        24 Dec 2006, 14:18        84.148.70.130        martin.tibit.de
751        24 Dec 2006, 14:08        65.55.209.142       
750        24 Dec 2006, 13:43        85.124.182.249       
749        24 Dec 2006, 13:24        64.4.8.118       
748        24 Dec 2006, 12:47        66.249.66.98       
747        24 Dec 2006, 12:01        84.174.90.219        martin.tibit.de
746        24 Dec 2006, 11:46        64.34.168.137       
745        24 Dec 2006, 11:36        74.6.85.236       
744        24 Dec 2006, 09:25        74.6.86.169       
743        24 Dec 2006, 03:57        74.6.86.205       
742        24 Dec 2006, 03:06        74.6.86.126       
741        24 Dec 2006, 00:34        84.190.110.112        martin.tibit.de
740        24 Dec 2006, 00:08        85.127.209.81        1338.at
739        24 Dec 2006, 00:00        80.109.30.189        fpdwl.roseflex.com

und er zeigt mir an, es waren maximal 5 Benutzer online pro Tag.
Es sind aber sicher mehr.
Wo hackt es da?

iG0r 25.12.2006 13:03

am besten einfach dein php script und sql dump anhängen. read only sql zugang reichen auch, falls der dump zu groß ist.

Potassium 25.12.2006 13:39

PHP-Code:

$query query("SELECT COUNT(*) AS c FROM ".TABLE_COUNTER." GROUP BY DATE_SUB(FROM_UNIXTIME(Counter_Date,'%Y-%m-%d'),INTERVAL 1 DAY)",__FILE__,__LINE__); 

Anbei das Dump File.

iG0r 25.12.2006 15:42

query und db scheint ok zu sein, denke der fehler, wenn immer nur 5 ausgegeben wird, muss irgendwo im php code sein.

Potassium 25.12.2006 15:58

PHP-Code:

    $query query("SELECT COUNT(*) AS c FROM ".TABLE_COUNTER." GROUP BY DATE_SUB(FROM_UNIXTIME(Counter_Date,'%Y-%m-%d'),INTERVAL 1 DAY)",__FILE__,__LINE__);
    
$row mysql_fetch_assoc($query);
    
$max_day $row["c"];
    echo 
$max_day

kannst du da einen Fehler entdecken?

iG0r 25.12.2006 16:14

ich behaupte mal da ist kein für mich erkennbarer fehler. vermute aber mal, wenn immer 5 ausgegeben wird, stimmt etwas mit deiner sql query class nicht. ich denke mal das wird __FILE__ oder __LINE__ anstelle des query results ausgegeben. steht der query zufällig in line 5? ;) versuch es doch mal mit einer sauberen sql abfrage, und ausgabe.

Potassium 25.12.2006 17:40

keine angst das passt schon.
das funktioniert überall wunderbar. das is blos eine funktion die ggf. einen sql-error ausgibt und mir mit __FILE__ und__LINE__ sagt wo der error is.

iG0r 25.12.2006 22:33

dann kann es nur noch eine wasserader sein. hab es anhand einer vbulletin 3 datenbank und der user table mit joindate getestet, klappt wunderbar.

Potassium 27.02.2007 14:25

Ich hab erst jetzt wieder Zeit gefunden daran weiter zu grübeln. Aber es hat was gebracht.
Hier nun die funktionierende Lösung:
PHP-Code:

$query query("SELECT COUNT(*) AS c, FROM_UNIXTIME(Counter_Date,'%Y-%m-%d') as sDate FROM ".TABLE_COUNTER.
GROUP BY DATE_SUB(FROM_UNIXTIME(Counter_Date,'%Y-%m-%d'),INTERVAL 1 DAY)
 ORDER BY c DESC"
,__FILE__,__LINE__

in sDate steht nun das Datum, mit den meißten Besuchern drin und in c halt die Anzahl.


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag