Gå til innhold

Anbefalte innlegg

Skrevet (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 av remi sture
Videoannonse
Annonse
Skrevet

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

Skrevet

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?

Skrevet

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

??

Skrevet (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 av remi sture
Skrevet
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).

Skrevet (endret)

Når jeg hører klientside, tenker jeg javascript i nettleseren, hører jeg serverside, tenker jeg PHP. Dette er altså feil?

Endret av remi sture
Skrevet

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?

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

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

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

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

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å
×
×
  • Opprett ny...