Avatar billede hypofysen Nybegynder
15. april 2010 - 12:12 Der er 7 kommentarer og
1 løsning

hjælp til udregning

Hej, jeg ved ikke om følgende giver mening men jeg har forsøgt at udregne nogle placeringer i et løb ud fra en sluttid og det virker ok men går alt for langsomt.

Er der en der kan komme med en lettere måde at lave en sådan udregning på?

public function calculateOverallRacePlace($table,$event)
    {   
        $getRace = new Database;
        $getRace -> select('wt_races','Race_id as rid','Event_id = "'.$event.'"');
               
        foreach($getRace -> result as $raceInfo)
        {
            $getRaceResult = new Database;
            $getRaceResult -> select($table,'*','Race_id = "'.$raceInfo['rid'].'" AND Finishtime_individual > 0 AND Timeofficial_calc > 0 AND Timeofficial_calc_net > 0','Timeofficial_calc ASC');
            $i = 1;
            $_SESSION['time'] = "";
            $_SESSION['place'] = 1;
            foreach($getRaceResult -> result as $row)
            {
           
                if(@$_SESSION['time'] == $row['Timeofficial_calc'])
                {
                    $place1 = $_SESSION['place'];
                }else{
                    $place1 = $i;
                    $_SESSION['place'] = $i;
                }   
                $i++;
                $_SESSION['time'] = $row['Timeofficial_calc'];
                $updPlace1 = new Database;

                $insArrayPlace1 = array('Placement_overall' => $place1);
                foreach($insArrayPlace1 as $key1 => $value1)
                {
                    $updPlace1 -> update($table,$key1,$value1,'Event_id = "'.$event.'" AND Race_id = "'.$raceInfo['rid'].'" AND Start_number = "'.$row['Start_number'].'"');
                }
               
            }
        }
    }
Avatar billede Slettet bruger
15. april 2010 - 13:12 #1
Når du laver så mange database forbindelser og forspørgelser som du for gjort i den kode, så undrer det mig ikke at den bruger en god del tid på at kæmpe sig igennem alle de loops.

Nu har jeg desværre ikke tid til at sætte mig helt ind i dine koder, men jeg ville nok lave en view på din tabel og sorterer det efter tiden. Derefter ville jeg bruge den view til at angive placeringer i din rigtige tabel.

Hvis du ikke kender til views, kan du se mere om det her (tager udgangspunkt i MySQL, håber det er det du bruger da det er umuligt at se ud fra din kode.)

Skal nok vende tilbage senere når jeg har mere tid, men håber du kan bruge ovenstående input!
Avatar billede hypofysen Nybegynder
15. april 2010 - 13:27 #2
Jeg er udmærket klar over at det langt fra er optimalt den måde det er bygget op :)

views har jeg aldrig hørt om, og tror lige jeg skal ha en til at uddybe det før jeg fanger ideen med det!

Og ja det er en MySQL database jeg bruger..

men tak for inputtet, jeg vil prøve at læse lidt mere om views og se om det giver mening.
Avatar billede Slettet bruger
15. april 2010 - 14:37 #3
Kan da godt komme med et hurtigt eksempel på en view.
Jeg tager udgangs punkt i vi har én tabel kaldet "entrants" der indeholder alle deltagere. Tabellen ser således ud:
ID - Int, Auto Increment, Primary Key
Name - Varchar
Finished - Time (tt:mm:ss)
place - Int

Vi skal bruge nogle deltagere, så lad os tage os selv - så vil tabellen se således ud:
ID - Name - Finished - Place
1 - roxki - 14:20:25 - 0*
2 - hypofysen - 14:20:10 - 0*

* Der er ikke udregnt pladser endnu, så derfor har vi begge plads 0

Nu laver vi så en view ud fra vores tabel hvor vi gerne vil ha deltagerens navn, id og sluttid - og dataen skal sorteres efter hurtigste først da hurtigst skal have første pladsen og langsomste sidste pladsen.
SQL koden for vores view vil se således ud:
CREATE VIEW view_places(name, id, time) AS SELECT name, id, finished FROM entrants ORDER BY finished ASC

Resultatet af vores view vil se således ud:
name - id - time
hypofysen - 2 - 14:00:10
roxki - 1 - 14:00:25

Vi kan nu lave en SELECT statement på vores view og angive placeringer ud fra hvilken række personen ligger på, første række = første pladsen, anden række = anden pladsen, osv.
Kode eksempel:
<?php
// view er oprettet som gennemgået så nu vil vi hente pladserne og opdaterer dem i 'entrants'-tabellen

// opretter database forbindelse
$db = mysql_connect(hostname, username, password);
mysql_select_db(database, $db);

// angiver hvilken plads vi starter fra
$plads = 1;

// looper igennem vores view
$query = mysql_query("SELECT * FROM view_places");
while($data = mysql_fetch_assoc($query)) {
  // Generere SQL kode til at opdaterer deltagerens placering
  $sql = "UPDATE entrants SET place = " . $plads . " WHERE id = " . $data["id"];
  // Udfører SQL forspørgelsen
  mysql_query($sql);
  // Ligger én til $plads så vi er klar til næste deltager
  $plads++;
}
?>


Håber det har givet mening og det kan bruges.
Koden er ikke testet, så fejl kan forkomme, men skal nok holde øje med tråden!
Avatar billede hypofysen Nybegynder
15. april 2010 - 15:00 #4
ok så er jeg lidt mere med :)

men på den måde kunne jeg vel ligeså godt bare hive resultatet ud sorteret efter tid og give placering lig med nummeret på den valgte række.

Problemet er at der sagtens kan være 2 tider der er ens og der skal placeringen også være den samme.

der kan altså eksempelvis være 3 med pacering nr. 4 hvorefter både 5 og 6 plads skal forsvinde
Avatar billede Slettet bruger
15. april 2010 - 15:24 #5
Jeg forslog at bruge views da jeg regnte med du ville have placeringen ind i tabellen, men efter hvad du skriver så ser det ikke ud til at have nogen betydning.
Hvis du gerne vil tjekke om flere har samme tid, kan det jo gøres ved at hente deltagerne og deres tid i "ascending order".
Du looper så deltagerne igennem og for hvert loop tjekker du om tiden passer med den forrige deltagers tid, gør den det så skal den pågældne person have samme placering som den forrige.
Du får lige et eksempel med på vejen:
<?php
// opretter database forbindelse
$db = mysql_connect(hostname, username, password);
mysql_select_db(database, $db);

// angiver starter variabler
$plads = 1;
$tid = "";
$count = 1;

// looper igennem vores view
$query = mysql_query("SELECT `name`, `time` FROM entrants ORDER BY `time` ASC");
while($data = mysql_fetch_assoc($query)) {
  // Tjekker om deltagerens tid er den samme som den forrige deltagers
  if($data["time"] == $tid) {
    $place = $plads;
  } else {
    $place = $count;
    $tid = $data["time"];
  }

  // Udskriver deltagere og deres placering
  echo $data["name"] . " @ " . $place . "pladsen med tiden " . $tid . "<br>";

  // Ligger én til $count
  $count++;
}
?>

Resultatet skulle gerne se ud ala dette her:
Format: %navn% @ %plads% pladsen med tiden %tid%

hypofysen @ 1 pladsen med tiden 14:20:10
roxki @ 2 pladsen med tiden 14:20:25
deltager3 @ 2 pladsen med tiden 14:20:25
deltager4 @ 4 pladsen med tiden 14:20:30

Koden er ikke testet, men fremgangsmåden burde intet fejle :-)
Avatar billede hypofysen Nybegynder
15. april 2010 - 15:30 #6
ok tror jeg forvirrer dig lidt for meget lige nu.

jeg beklager hvis jeg ikke har uddybet spørgsmålet nok.

Jeg tror det jeg skal bruge er en kombination af de to eksempler du er kommet med.

Jeg skal tage højde for om deltagerene har samme tid altså også samme pladsering og det skal skrives i databasen.

Jeg prøver lige at lege lidt med dine to eksempler og ser om jeg kan få det til noget fornuftigt :)
Avatar billede Slettet bruger
15. april 2010 - 16:20 #7
I sidste eksempel kan du jo opdaterer den række man er kommet til og du har jo allerede $place der indeholder pladsen.
Avatar billede hypofysen Nybegynder
09. juni 2010 - 08:43 #8
lukker
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