31. juli 2008 - 18:19Der er
6 kommentarer og 1 løsning
Tælle en gang med GROUP BY funktionen
Jeg har en database med besøg, som jeg pt aflæser på denne måde
countSQL = "Select dato, COUNT(1) FROM visitors GROUP BY dato"
men problemet er at jeg har flere fra samme id på samme dato, og jeg vil kun have hvert id en gang.
eksempel som det er lige nu dato - navn - id 2008-08-30 Jens 001 2008-08-30 Jens 001 2008-08-30 Bent 002 2008-08-30 Jens 001 2008-08-30 Bent 002 2008-08-30 Jens 001 2008-08-30 Jens 001
Her vil den jo så sige 7, men der har jo faktisk kun været 2 besøgende, de har bare været flere gange.
Hvordan får jeg sådan så den kun læser hver en gang? Gerne bestemt ud fra deres id, da det aldrig vil være dobbelt.
Teknologi, AI og forretning er i centrum på Computerworlds Cloud og AI Festival i København d. 18. og 19. september. Se hele programmet for den store konference om strategisk brug af Cloud og AI på: www.cloud-festival.dk
dato - navn - id 2008-08-30 Jens 001 2008-08-30 Jens 001 2008-08-30 Bent 002 2008-08-30 Jens 001 2008-08-30 Bent 002 2008-08-30 Jens 001 2008-08-30 Jens 001
der er 7 besøg, her fra to personer (der vil være et par hundrede mere når det bliver brugt rigtigt), besøgene er her kun fra en dato, men der vil være flere datoer.
Jens har været her 5 gange, og Bent har været her 2 gange, og det er jo ialt 7 besøg, hvilket den også vil vise sådan som jeg har det lige nu.
Men det jeg vil have er at den kun viser 2 besøg, efter som der kun har været 2 forskellige her, dog har de været her flere gange, men det er jeg ikke interesseret i at vide, kun hvor mange forskellige der har været her på den dato.
Måske det vil være bedre at oprette spm. i rette sql kategori ?
Men du kan også bruge: SELECT `dato` FROM `visitors` GROUP BY `dato`, `navn` så får du ganske vist flere rækker ud end nødvendigt, ( flere dato er samme ), men så kan du i din kode lave et par "if" for at få vist dag og antal hits.
I php og Mysql, kunne det gøres så'n:
$find = "SELECT `dato` FROM `visitors` GROUP BY `dato`, `navn`"; $p = mysql_query($find) or die (mysql_error());
$antal = mysql_num_rows($p);
// ialt bruges til at få vist sidste dato $ialt = 0;
// hits tælles op for hvert row, og nulstilles hvis datoen skifter $hits = 0;
while($t = mysql_fetch_object($p)) { $ialt++;
// er $dag defineret, og er den ikke den samme datoen fra db if(isset($dag) && $t->dato != $dag) { echo"<br>".$dag.", Hits = ".$hits; // Nulstil hits $hits = 0; }
// definer $dag $dag = $t->dato; // Tæl hits op med 1 $hits++;
// Hvis sidste række er nået if($ialt == $antal) { echo"<br>".$dag.", Hits = ".$hits; echo"<br>Ialt: ".$antal; } }
Men det virker lidt "overkill" at skulle gøre så'n ?
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.