[PHP / MYSQL] Efficiente scorelijst

Pagina: 1
Acties:

  • Vigory
  • Registratie: November 2000
  • Laatst online: 15-04 10:26
Hoi,

Ik heb een scoretabel. De tabel ziet er als volgt uit: naam, score

Er staan ongeveer 2000 score's in.

<naam> kan inloggen op de website. Nu wil ik heb 2 dingen laten zien:
- Zijn positie in de scorelijst.
- Een lijste van 10 namen, met in het midden je eigen naam, waarin je kan zien wie er vlak voor je en achter je in de scorelijst zijn. Dit zie je bijv. ook bij F1 manager.

Nu kan ik natuurlijk een hele recordset van 2000 namen aflopen deze 2 dingen genereren. Maar ik vroeg mij af: kan het efficienter, dus: kan ik deze gegevens door middel van een query opvragen?

Vigory.

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

In mysql kun je limit gebruiken om je resultaatset te beperken heb ik begrepen.
Je zou dan 2 query's krijgen, eentje <= en eentje > (of < en >=).
Of het efficienter is zou ik niet kunnen voorspellen.

Who is John Galt?


  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
Heb je ooit gehoord van het LIMIT commando van MySQL? Hiermee kan je een selectie van bijvoorbeeld 10 spelers maken. Als je ff je db-design post wordt het misschien wat duidelijker voor de gotters zodat men met wat concretere oplossingen kan komen

  • Vigory
  • Registratie: November 2000
  • Laatst online: 15-04 10:26
DB design is heel simpel:

naam | score
--------------
Piet | 15
Jan | 30
Klaas | 23
Kees | 41

Verwijderd

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?
$query1 = "
SELECT naam, score FROM 
    scoretabel 
WHERE score > '$waarde' 
ORDER BY score ASC 
LIMIT 5";

$query2 = "
SELECT naam, score FROM 
    scoretabel 
WHERE score < '9' 
ORDER BY score DESC 
LIMIT 5";
?>

De waardes die nu uit query 1 komen, zou je in een array moeten gooien en weer om moeten draaien, aangezien die er nu "verkeerd" om uit rollen. Je kan hier geen nml jammer genoeg geen DESC invullen om je volgorde te bepalen ...

de 10 (11 eigenlijk) die je nu wil tonen zijn dus $query1.$naamvandepersoondiejezoekt.$query2
Iets mooiers kan ik er zo snel ook niet van maken .. suc6!

  • Vigory
  • Registratie: November 2000
  • Laatst online: 15-04 10:26
Okay, en kan ik ook door middel van een sql query de positie in de hele scorelijst opvragen?

Dus bijv: "u staat op nummer 1528".

of zal ik dan toch echt alles moeten opvragen en tellen bij het hoeveelste record <naam> voorbij komt

Verwijderd

Ik gok dat je inderdaad de hele lijst door zal moeten.
Ik zie in ieder geval geen mogelijkheid met je huidige DB ontwerp om de positie te bepalen.

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

Voor een score:
PHP:
1
2
3
4
5
<?
Select count(naam) 
from scoretabel 
where score > $waarde
?>

Voor meerdere scores sorteer je gewoon Desc en vraag je de positie van de eerste op.


nog even een poging:
Geen flauw idee of dit werkt, maar in theorie...
PHP:
1
2
3
4
5
6
7
<?
SELECT count(t2.id) as positie, t1.naam, t1.score
FROM scoretabel AS t1, scoretabel AS t2
WHERE t2.score> t1.score
GROUP BY t1.naam
ORDER BY t1.score
?>

Localhost, sweet localhost


  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

in access is het dit:
PHP:
1
2
3
4
5
6
7
<?
SELECT t1.Naam, t1.score, (Count(t2.score)+1) AS positie
FROM scoretabel AS t1 
    LEFT JOIN scoretabel AS t2 ON t1.score < t2.score
GROUP BY t1.Naam, t1.score
ORDER BY t1.score;
?>

Handelt gedeelde plaatsen ook netjes af.

Localhost, sweet localhost

Pagina: 1