[edit]
En fait, j'ai l'impression d'avoir pas lu la question ("L'attribution du rang").
Ce rang n'est normalement pas nécessaire: quand le joueur demande "les joueurs du 314e au 420e" alors le rang est simplement calculé à la volée lors de l'affichage, soit via un compteur dans une boucle for (for ($rang=314; ($row=$mysqli->fetch_array()); $rang++)) soit via l'index du résultat si tous les résultats sont traités d'un coup (foreach ($pdo->fetch_all() as $i=>$row) { $rang = 314+$i; /* ... traitement de la ligne $row ...*/ }).
Après, on peut aussi le faire dans le SGBD, via ce genre de trick (je trouve cette approche plus élégante même):
Si t'as ces informations dans la BDD, alors le classement est un simple tri des lignes que cette BDD te renvoie:
Si ce sont des valeurs calculées à la volée, je te conseillerai de les stocker en BDD:
Ce genre de requête pouvant être très lourd, le mieux est alors d'avoir une table stockant les bénéfices réalisés par chaque joueur pour la journée (par exemple) et de piocher le classement dans cette table.
Après, à l'affichage, il faut simplement proposer une numérotation de page (ou assimilée) et afficher ces résultats du N au N+k eme
Dans tous les cas, c'est au SGBD de faire le travail de tri et d'ordonnancement: évite de le faire dans le langage client (genre dans PHP) pour des raisons de lourdeur et de lenteur (cela obligerait PHP à lire inutilement toute la BDD par exemple).
En fait, j'ai l'impression d'avoir pas lu la question ("L'attribution du rang").
Ce rang n'est normalement pas nécessaire: quand le joueur demande "les joueurs du 314e au 420e" alors le rang est simplement calculé à la volée lors de l'affichage, soit via un compteur dans une boucle for (for ($rang=314; ($row=$mysqli->fetch_array()); $rang++)) soit via l'index du résultat si tous les résultats sont traités d'un coup (foreach ($pdo->fetch_all() as $i=>$row) { $rang = 314+$i; /* ... traitement de la ligne $row ...*/ }).
Après, on peut aussi le faire dans le SGBD, via ce genre de trick (je trouve cette approche plus élégante même):
Code :
SELECT (@r:=@r+1) AS rang, j.*
FROM joueurs_stats AS j, (SELECT @r:=314) AS ranking
LIMIT 106 OFFSET 314
-- Ok, "de 314 à 420", j'ai un peu abusé, d'autant que souvent
-- on cherche le classement "des 20 joueurs à partir du 500e" par exemple
Si t'as ces informations dans la BDD, alors le classement est un simple tri des lignes que cette BDD te renvoie:
Code :
SELECT * FROM joueurs_stats
ORDER BY joueurs_stats.benefices ASC LIMIT 10 OFFSET 500 -- Du 500e au 510e
Si ce sont des valeurs calculées à la volée, je te conseillerai de les stocker en BDD:
Code :
SELECT * FROM joueurs
INNER JOIN joueurs_benefices ON joueurs_benefices.id_joueur=joueurs.id
ORDER BY SUM(joueurs_benefices.valeur) ASC LIMIT 10 OFFSET 500 -- Du 500e au 510e
Ce genre de requête pouvant être très lourd, le mieux est alors d'avoir une table stockant les bénéfices réalisés par chaque joueur pour la journée (par exemple) et de piocher le classement dans cette table.
Après, à l'affichage, il faut simplement proposer une numérotation de page (ou assimilée) et afficher ces résultats du N au N+k eme
Dans tous les cas, c'est au SGBD de faire le travail de tri et d'ordonnancement: évite de le faire dans le langage client (genre dans PHP) pour des raisons de lourdeur et de lenteur (cela obligerait PHP à lire inutilement toute la BDD par exemple).