Rang d'un enregistrement MySQL

Résolu
escorizaweb Messages postés 3 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 2 mars 2007 - 1 mars 2007 à 14:40
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 - 2 mars 2007 à 16:23
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

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
1 mars 2007 à 19:33
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
3
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
1 mars 2007 à 16:33
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.
0
cs_mfaraday Messages postés 144 Date d'inscription vendredi 18 avril 2003 Statut Membre Dernière intervention 4 janvier 2010
1 mars 2007 à 18:05
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
0
escorizaweb Messages postés 3 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 2 mars 2007
1 mars 2007 à 19:18
Euhhhh j'ai testé et ça n'a pas l'air de me donner le classement...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
weboide Messages postés 30 Date d'inscription samedi 19 avril 2003 Statut Membre Dernière intervention 13 mars 2007
1 mars 2007 à 19:19
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?
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
1 mars 2007 à 19:34
Où 3  (joueur_id = 3) est à remplacer par l'id du joueur dont tu visualises la fiche, évidemment...
0
escorizaweb Messages postés 3 Date d'inscription lundi 27 mars 2006 Statut Membre Dernière intervention 2 mars 2007
2 mars 2007 à 00:53
Merci je vais tester cela...
0
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
2 mars 2007 à 09:57
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.
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
2 mars 2007 à 10:56
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 :-)
0
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
2 mars 2007 à 11:59
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.
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
2 mars 2007 à 13:05
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.
0
syndrael Messages postés 2378 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 29 décembre 2012 20
2 mars 2007 à 15:30
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.
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
2 mars 2007 à 16: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...!
0
Rejoignez-nous