remi sture Skrevet 2. november 2006 Del Skrevet 2. november 2006 (endret) Heisann! Jeg har en tabell (MySQL) med timestamps og ønsker å liste ut antallet som er registrert i dag. Jeg har prøvd følgende uten resultat: SELECT COUNT(`id`) AS 'id', FROM_UNIXTIME( `date` , '%d.%m.%y' ) AS 'date' FROM webCounter WHERE 'date' = FROM_UNIXTIME( UNIX_TIMESTAMP( ) , '%d.%m.%y' ) Endret 2. november 2006 av remi sture Lenke til kommentar
endrebjo Skrevet 2. november 2006 Del Skrevet 2. november 2006 (endret) SELECT COUNT(DATE(date)) AS antall FROM webCounter WHERE DATE(date) = CURDATE(); Endret 2. november 2006 av endrebjorsvik Lenke til kommentar
remi sture Skrevet 2. november 2006 Forfatter Del Skrevet 2. november 2006 Tusen takk for den, men den funket ikke. Fikk hjelp på norskwebforum, og endte opp med denne: SELECT COUNT(*) FROM webCounter WHERE CURDATE() = FROM_UNIXTIME(date,'%Y-%m-%d') Neste problem er å hente ut antall unike ip-adresser. Akkurat det er ikke noe problem, men jeg har en gitt timeout jeg også skal forholde meg til. For eksempel hvis denne er satt til 30 minutter, og samme ip er registrert klokken 14:00, 14:15 og 14:45, skal den altså telle kun to. Noen som kan hjelpe meg med den? Her er tabell-strukturen hvis det er nødvendig. CREATE TABLE `webCounter` ( `id` int(6) NOT NULL auto_increment, `date` int(10) NOT NULL default '0', `ip` varchar(23) NOT NULL default '', `userAgent` varchar(150) NOT NULL default '', `referrer` varchar(200) default NULL, `sessionId` varchar(32) default NULL, PRIMARY KEY (`id`) ); Lenke til kommentar
roac Skrevet 3. november 2006 Del Skrevet 3. november 2006 Dette må gjøres rekursivt og blir en noe tung jobb. Jeg er faktisk ikke sikker på om det lar seg løse på noe fornuftig vis i MySQL, i MSSQL hadde jeg brukt Comon Table Expressions (CTE) for å løse dette. Har du mulighet til å gjøre dette på klientsiden? Lenke til kommentar
Manfred Skrevet 3. november 2006 Del Skrevet 3. november 2006 Hva med at du bruker dato-funksjonene i php til å finne timestamp for dd-mm-yyyy 00:00:00 og dd-mm-yyyy 23:59:59 og kjører en WHERE date BETWEEN " & dato1 & " AND " & dato2 ?? Lenke til kommentar
remi sture Skrevet 3. november 2006 Forfatter Del Skrevet 3. november 2006 (endret) Ja, men jeg skal jo ikke hente ut alle mellom to tidspunkt. Det den skal gjøre er jo å telle kun én forekomst hvis det finnes flere innenfor en gitt intervall. Hvis denne er satt til f.eks. 30 minutter, skal den altså telle to forekomster her: 10:12, 10:16, 10:43 Endret 3. november 2006 av remi sture Lenke til kommentar
remi sture Skrevet 3. november 2006 Forfatter Del Skrevet 3. november 2006 (endret) Har du mulighet til å gjøre dette på klientsiden? Klientsiden? Med Javascript mener du? Endret 3. november 2006 av remi sture Lenke til kommentar
roac Skrevet 3. november 2006 Del Skrevet 3. november 2006 Har du mulighet til å gjøre dette på klientsiden? Klientsiden? Med Javascript mener du? 7209850[/snapback] Neppe, tviler på at du kobler deg på databasen fra javascript. PHP/ASP/JSP er typiske klienter (for databasen). Lenke til kommentar
remi sture Skrevet 3. november 2006 Forfatter Del Skrevet 3. november 2006 (endret) Når jeg hører klientside, tenker jeg javascript i nettleseren, hører jeg serverside, tenker jeg PHP. Dette er altså feil? Endret 3. november 2006 av remi sture Lenke til kommentar
remi sture Skrevet 3. november 2006 Forfatter Del Skrevet 3. november 2006 Dette er det jeg har kommet fram til foreløpig: <?php function get_visits_total() { $count = 0; $tempTimestamp = 0; $timeout = 1800; $query = mysql_query("SELECT date, ip FROM webCounter ORDER by ip"); while($sql = mysql_fetch_object($query)) { if(($sql->date - $tempTimestamp) >= $timeout) { $count++; $tempTimestamp = $sql->date; } } return $count; } ?> Men jeg må jo ha med ip i sammenligningen og på en eller annen måte, for nå får jeg ut dette, men det skulle vel vært 4? 03.11.06 10:00 | 111.111.111.111 03.11.06 10:14 | 111.111.111.111 03.11.06 10:32 | 111.111.111.111 03.11.06 10:34 | 111.111.111.111 03.11.06 10:52 | 111.111.111.111 03.11.06 10:09 | 111.111.111.222 03.11.06 10:23 | 111.111.111.222 03.11.06 10:40 | 111.111.111.222 * Unike treff totalt: 2 Anyone? Lenke til kommentar
endrebjo Skrevet 3. november 2006 Del Skrevet 3. november 2006 Tusen takk for den, men den funket ikke. 7207936[/snapback] Det er ikke så rart når du lagrer datoer som UNIX-timestamps i en integer-kolonne. Jeg antok at du hadde brukt TIMESTAMP-datatypen. Lenke til kommentar
remi sture Skrevet 3. november 2006 Forfatter Del Skrevet 3. november 2006 Er det feil å ha en integer-kolonne då? Lenke til kommentar
endrebjo Skrevet 3. november 2006 Del Skrevet 3. november 2006 Det er ikke feil, men jeg synes det virker mer logisk og praktisk å bruke en dato-type (f.eks timestamp eller datetime). Databasen er også optimalisert for det. Lenke til kommentar
blackbrrd Skrevet 13. november 2006 Del Skrevet 13. november 2006 Synes kriteriene her er litt lite spesifike, men la meg gjøre et par antagelser, f.eks at det er greit å bruke faste intervaller, dvs at hvis en ip blir logget kl 14:15, 14:17, 14:19 og 14:31 skal du få ett treff for de tre første klokkeslettene siden de skjedde mellom kl 14:00 og 14:30, og ett treff for 14:31. Isåfall kan du kjøre heltallsdivisjon på dato kolonnen din med ønsket oppløsning, f.eks 30 minutter = 30*60*1000=1800000 millisekunder (antar at datoen er lagret med en oppløsning på 1ms). Dette kan du så bruke i en spørring som ligner litt på dette: SELECT count(ip) FROM table GROUP BY date/18000000 hmm ganske sikker på at den spørringen der ble feil, men noen andre her burde kunne rette opp i det hvis forutsetningen mine over er akseptable Lenke til kommentar
roac Skrevet 14. november 2006 Del Skrevet 14. november 2006 Synes kriteriene her er litt lite spesifike, men la meg gjøre et par antagelser, f.eks at det er greit å bruke faste intervaller, dvs at hvis en ip blir logget kl 14:15, 14:17, 14:19 og 14:31 skal du få ett treff for de tre første klokkeslettene siden de skjedde mellom kl 14:00 og 14:30, og ett treff for 14:31. 7280228[/snapback] Slik jeg forstaar det er det spesifikt nok. Det betraktes som ett besoek saalenge det ikke er over en halvtime uten aktivitet. Derav behov for rekursivitet eller loepenede aggregering for aa loese problemet. Lenke til kommentar
remi sture Skrevet 14. november 2006 Forfatter Del Skrevet 14. november 2006 Stemmer, Roac. Noen som kan hjelpe meg med en php-kode for å løse dette? Lenke til kommentar
endrebjo Skrevet 14. november 2006 Del Skrevet 14. november 2006 (antar at datoen er lagret med en oppløsning på 1ms). 7280228[/snapback] UNIX timestamp bruker sekunder. Lenke til kommentar
blackbrrd Skrevet 14. november 2006 Del Skrevet 14. november 2006 Stemmer, Roac. Noen som kan hjelpe meg med en php-kode for å løse dette? 7281279[/snapback] Høres ut som du burde få tråden flyttet til php forumet Lenke til kommentar
roac Skrevet 14. november 2006 Del Skrevet 14. november 2006 Stemmer, Roac. Noen som kan hjelpe meg med en php-kode for å løse dette? 7281279[/snapback] Hmm, hva i all vide verden var det jeg tenkte paa naar jeg sa at maatte bruke rekursjon? Tanken er jo ganske enkel, men gir uten indeks paa klokkeslett fort et stygt tidsforbruk: select * from tabell t1 where not exists ( select * from tabell t2 where (tabell t2.tid < t1.tid) and (t2.tid > t1.tid - 30.0/1440) and (t1.ip = t2.ip) Men, naa maa det sies at det aa sjekke paa IP er en svaert daarlig identifikator, all den tid alle besoekende fra en bedrift som regel synes aa komme fra en IP, IPen det eksterne interfacet paa bedriftens brannmur/router. Lenke til kommentar
remi sture Skrevet 14. november 2006 Forfatter Del Skrevet 14. november 2006 Heisann! Hvor får du 1440 fra da? Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå