Rang d'un enregistrement MySQL [Résolu]

Signaler
Messages postés
3
Date d'inscription
lundi 27 mars 2006
Statut
Membre
Dernière intervention
2 mars 2007
-
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
-
Bonjour à tous,


Je cherche à connaître le "rang" d'un de mes enregistrements de ma bdd.


Je m'explique, j'ai une table 'joueurs' avec un champ joueur_id, joueur_score.


Je voudrais quand je suis sur la fiche individuelle d'un joueur,
obtenir le rang de ce joueur dans le classement de tous les joueurs de
ma table classés par joueur_score DESC.


En espérant que vous pourrez m'enlever cette épine du pieds car je câle depuis hier,


Merci beaucoup d'avance,


Matthieu

13 réponses

Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Hello,

$tab[$row['joueur_id']] = $i++ ;

en fait.
Et tu appelles l'index voulu de ton tableau (l'id de ton joueur, en fait) pour connaître son rang.
Vaut aussi mieux partir de $i = 1.

Sinon, si tu peux avec ta version de mysql :

SELECT (count( * ) +1) AS rang
FROM joueursWHERE score <(SELECT joueur_score FROM joueurs WHERE joueur_id3 )
ORDER BY joueur_score DESC
Messages postés
2381
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
16
ALors je ferai une requete dans le genre
select count(*) as nb from joueurs1, joueurs2 where joueurs1.joueur_score > joueurs2.joueur_score and joueurs2.joueur_id = Ton-id-du-joueur
Et tu rajoutes + 1 au résultat.
vous en pensez koa tout le monde ??
S.
Messages postés
144
Date d'inscription
vendredi 18 avril 2003
Statut
Membre
Dernière intervention
4 janvier 2010

Salut

Perso je pense pas que escorizaweb crée une table par joueur :)

Moi je ferai plutôt un "select joueur_id from joueurs order by joueur_score desc" après je pense qu'il te faut "passer sous" php et la tu jongles avec le tableau de résultats

$result = mysql_query($sql);

$i = 0;

while($row = mysql_fetch_assoc($result))
    {
    $tab[$i++] = $row['joueur_id'];
    }

et la tu obtiens un tableau avec $tab[1] : id du joueur

Voili voilou

Flo
Messages postés
3
Date d'inscription
lundi 27 mars 2006
Statut
Membre
Dernière intervention
2 mars 2007

Euhhhh j'ai testé et ça n'a pas l'air de me donner le classement...
Messages postés
30
Date d'inscription
samedi 19 avril 2003
Statut
Membre
Dernière intervention
13 mars 2007

Salut,

à terme, le mieux serait de tenir à jour un champs "position" attribué à chaque utilisateur, que tu mettras à jour à chaque changement de score, t'essaye de garder une table trié comme ca le tri pour changer la position sera linéaire et pas tres complexe (supposons que ce joueur était  au milieu avec un score X, et que son score baisse, il faudra parcourir la table vers le bas (donc en moyenne, la moitié mais au pire des cas toute la table..) et décrementer la position à chaque utilisateur parcouru dont le score est supérieur à X et incrémenter celle de l'utilisateur à déplacer.

j'ai peut etre pas été assez clair, mais ca reste basic, c comme si t'insérer une valeur dans un tableau deja trié, tu parcours linéairement et tu le mets à sa bonne place.

Vous en pensez quoi?
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Où 3  (joueur_id = 3) est à remplacer par l'id du joueur dont tu visualises la fiche, évidemment...
Messages postés
3
Date d'inscription
lundi 27 mars 2006
Statut
Membre
Dernière intervention
2 mars 2007

Merci je vais tester cela...
Messages postés
2381
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
16
Alors là, je m'insurge.. Malalam PLAGISTE euh non.. PLAGIEUR !! LOL !!
Ma requete était boooooooonnnnneee !!! Et c'est po elle ki a été acceptéeeeee !!
Ouiiiiinnnnnn !!! Par contre, je ne sais pas ce ke ça donne en terme de perfs entre la tienne et la mienne. Je pense ke la tienne mériterait un limit 1 dans le Select imbriqué..
Je demande réparation, NA !!!
En tout cas, j'aime voir ses réponses différentes mais ki tiennent la route..
S.
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Heu...la tienne n'était pas bonne, non, vu que tu impliquais 2 tables joueurs, qui n'existent pas ?
LIMIT est totalement inutile ici...on fait un COUNT, ça ne renvoie qu'une ligne.

Plus simple, vu que normalement tu as déjà le score du joueur, puisque tu es sur sa fiche :

SELECT (count( * ) +1) AS rang
FROM joueurs
WHERE score <= {__SCORE_FICHE_JOUEUR__}
ORDER BY joueur_score DESC

où {__SCORE_FICHE_JOUEUR__} ets le score de ton joueur :-)
Messages postés
2381
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
16
Euh.. j'ai po compris pour les 2 tables joueurs.. Je créais une jointure car l'hypothèse de base était qu'on avait que l'id du joueur (po le score).
Ensuite le Limit il était dans la sous-requete
Par contre, moi c'est le Order de ta requete dont je ne vois pas l'utilité..
Ouh là là.. il faut ke je me fasse une base pour tester, c'est un bon sujet, tout simple mais sympathique a traité.. Car je pense tout de suite à l'optimisation..
S.
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Bon, on reprend ;-)
Ta requête :
select count(*) as nb from joueurs1, joueurs2 where joueurs1.joueur_score > joueurs2.joueur_score and joueurs2.joueur_id = Ton-id-du-joueur
from joueurs1, joueurs2 implique que tu as 2 tables. Une jointure, d'ailleurs, se fait sur 2 tables.

SELECT (count( * ) +1) AS rang
FROM joueurs
WHERE score <= {__SCORE_FICHE_JOUEUR__}
ORDER BY joueur_score DESC
 =>
Cela va compter le nombre de joueurs ayant un score plus petit que celui du joueur recherché (j'ai pris comme base que plus le score était petit, mieux on était placé, ce qui est sans doute fauix ;-) Il faut inverser la comparaison dans ce cas.
Il n'y a tjrs qu'un seul jeu de résultat renvoyé ici.

SELECT (count( * ) +1) AS rang
FROM joueursWHERE score <(SELECT joueur_score FROM joueurs WHERE joueur_id3 )
ORDER BY joueur_score DESC
Ma 1ère requête : pareil, même principe, la sous requête ne va renvoyer qu'une ligne puisque je vais juste chercher le score du joueur dont on veut ocnnaitre le rang.

Bref, pas de LIMIT, non.

Le order by était là par erreur et il y est tjrs par erreur.
Messages postés
2381
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
29 décembre 2012
16
Oups.. coquille de ma part..
select count(*) as nb from joueurs joueurs1, joueurs joueurs2 where joueurs1.joueur_score > joueurs2.joueur_score and joueurs2.joueur_id = Ton-id-du-joueur
Voilou !!

SELECT (count( * ) +1) AS rang
FROM joueursWHERE score <(SELECT joueur_score FROM joueurs WHERE joueur_id3 LIMIT 1 )
ORDER BY joueur_score DESC
Il est au dessus le limit.. Mais bon, on va po chipoter..

SELECT (count( * ) +1) AS rang
FROM joueursWHERE score < (SELECT joueur_score FROM joueurs WHERE joueur_id3 limit 1)
Cela semble être la bonne requete.. réponse collégiale, après il faudrait voir en terme de perfs, ne soyons po plus royaliste ke le roi..
S.
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
(SELECT joueur_score FROM joueurs WHERE joueur_id =3 limit 1)
Mais ça ne sert à rien ! Puisque ce select ne peut renvoyer qu'une seule ligne...!