Avatar billede kimkochrasmussen Nybegynder
27. september 2011 - 23:34 Der er 2 kommentarer og
1 løsning

Udvælge poster...

Jeg er ved at lave en lille løbsdatabase, hvor det er planen at løberne skal registreres for hver omgang de løber, med scan af en stregkode.
Jeg har så en db med følgende
ID; timestamp

Jeg har så brug for en funktion der kan fortælle mig hvor mange omgange en løber har foretaget, altså en countRunner(ID) der returnerer et antal. MEN jeg kan ikke bare bruge count på min database, da en løber god på samme omgang kan være registreret flere gange (fx ved læsning af stegkoden 5 gange kort efter hinanden). Jeg har altså brug for at kunne sorterer en række registreringer fra, kriteriet er at der skal være min 2 min. mellem to registreringer for at de begge tæller.
Nogen der kan hjælpe med med en sådan funktion?

Desuden skal keg også gerne bruge en timeRunner(ID), der udregner tiden for en given løber mellem første registrering og den sidste,forstået på den måde at hvis der på sodste omgang sorteres tider fra (inden for 2 min.), er det den første scanning der skal bruges som sidste tid...
Nogen bud på det?

På forhånd tak for hjælpen
28. september 2011 - 07:41 #1
Måske er det nemmest i mysql at søge efter alle værdier uanset tidsforskel og i php placere værdierne i en 'dirty' array.  Derefter placerer du i en 'clean' array den første værdi af din 'dirty' array og derefter alle andre værdier fra den 'dirty' array der er mindst 120 sekunder større end sin forgænger.  Så kan du med din 'clean' array tælle antal runder ved count($cleanArray) - 1, og du kan tage totaltiden som $cleanArray[count($cleanArray - 1]) - $cleanArray[0].

Jeg lavede en tabel kimkochrasmussen med felterne runner og scan.  Der kørte jeg nedenstående kode, og jeg fik de forventede værdier i min $cleanArray.

$runner = 1;
$result = mysql_query("SELECT TIME_TO_SEC(scan)  FROM kimkoch WHERE runner = $runner ORDER BY TIME_TO_SEC(scan)");
while($row = mysql_fetch_array($result)) $array[] = $row[0];
$count = count($array);
$cleanArray[] = $array[0];
echo "$cleanArray[0]<br>";
for($i = 1; $i < $count; $i++)
{
  $dif = $array[$i] - $array[$i - 1];
  if($array[$i] - $array[$i - 1]>= 120) $cleanArray[] = $array[$i];
}
foreach($cleanArray as $clean) echo "$clean<br>";
28. september 2011 - 07:47 #2
I stedet for at hard-kode 120 kunne du sige $forskel= 120 og så i din løkke sige

if($array[$i] - $array[$i - 1]>= $forskel) $cleanArray[] = $array[$i];

Hvis du så vil bruge systemet for eksempel til meget korte runder hvor en runde meget vel kan tage mindre end 2 minutter, så kan du for eksempel sætte $forskel til 60.
Avatar billede kimkochrasmussen Nybegynder
28. september 2011 - 14:17 #3
Jeg takker mange gange - det virker bare perfekt.

Af hensyn til andre bør måske nævnes at scan skal være af typen TIME og ikke TIMESTAMP (det drillede mig lige lidt)

Men tak for et godt og brugbart svar!
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester