[mysql][php] while lus probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Haranaka
  • Registratie: September 2000
  • Laatst online: 08-09 09:36
Versimpeld gesteld heb ik een database (mysql) met daarin onder andere datums en posities. Het gaat om een wedstrijdklassement, de ene dag sta ik 1ste, de volgende dag sta ik bv 4de.
Nu wil ik mijn relatieve positie gaan berekeken ten opzichte van de dag ervoor. Dus in mijn gestelde voorbeeld ben ik 3 plekken gezakt.

Wat ik nu heb aan code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
$sql = "select date, positie from table order by date desc";
$result = mysql_query($sql,$connect)
    or die(mysql_error());

echo "<table>";

while($row=mysql_fetch_array($result)){
   echo "<tr><td>";
   echo $row["date"] . "</td><td>" . $row["positie"];
   echo "</td></tr>\n";
  }

echo "</table>";


Nu moet er dus achter de $row["positie"] de relative positie worden getoont.
Nu kan ik wel in de while lus weer een connectie maken met mysql en de positie ophalen van de dag ervoor en hem zo gaan berekeken.
Maar dat zie ik niet zo zitten, aangezien er namelijk nogal wat rijen in de db staan (nu 200, maar dat worden er iedere dag meer) en omdat ik die posities 1 stap verder in de lus zelf al binnenhaal.

Als de sql statment anders gesorteerd was, dan krijg ik de oudste datums eerst in de while lus, dan zou het vrijmakkelijk kunnen omdat je dan de huidige positie meegeeft aan de volgende stap van de lus:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$sql = "select date, positie from table order by date";
$result = mysql_query($sql,$connect)
    or die(mysql_error());

echo "<table>";

while($row=mysql_fetch_array($result)){
   $relatief = $row["positie"] - $gister;
   echo "<tr><td>";
   echo $row["date"] . "</td><td>" . $row["positie"] . "</td><td>" . $relatief;
   echo "</td></tr>\n";
   $gister = $row["positie"]
  }

echo "</table>";


Maarja, zo wil ik het dus niet hebben staan op mijn website :)

Daarom dacht ik dat er misschien een slimmere oplossing voor was. Misschien kan iemand me over dit soort onderwerpen iets bijleren.

...


Acties:
  • 0 Henk 'm!

  • Banpei
  • Registratie: Juli 2001
  • Laatst online: 25-10-2022

Banpei

Hachiroku on this touge?

Misschien alles in een array fetchen en die vervolgens kopieeren en sorteren op datum en het met elkaar vergelijken. Scheelt iig wel weer een tweede query.

AE86 gevonden! | So what I thought I'd do was, I'd pretend to be one of those deaf-mutes.


Acties:
  • 0 Henk 'm!

Verwijderd

alhoewel ik denk dat een query naar je database sneller is dan jouw oplossing...

Acties:
  • 0 Henk 'm!

  • Banpei
  • Registratie: Juli 2001
  • Laatst online: 25-10-2022

Banpei

Hachiroku on this touge?

Verwijderd schreef op 03 February 2003 @ 15:56:
alhoewel ik denk dat een query naar je database sneller is dan jouw oplossing...
Alles is sneller dan een geneste query in een while-lus. :P

AE86 gevonden! | So what I thought I'd do was, I'd pretend to be one of those deaf-mutes.


Acties:
  • 0 Henk 'm!

  • Goodielover
  • Registratie: November 2001
  • Laatst online: 16-09 09:38

Goodielover

Only The Best is Good Enough.

Bereken de relatieve positie aan de hand van een join in je statement met dezelfde tabel, maar dan een dag terug. dus twee keer die tabel met statistieken erbij en left joinen op vorige dag.
code:
1
2
3
4
5
In pseudo-code
select t1.date
      ,t1.positie
      ,t1.positie - t2.positie
from   table t1 left join table t2 on t1.date = t2.date+1