Gå til innhold

Anbefalte innlegg

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 av remi sture
Lenke til kommentar
Videoannonse
Annonse

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

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

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 av remi sture
Lenke til kommentar

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
  • 2 uker senere...

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...