Rang d'un enregistrement MySQL [Résolu]

escorizaweb 3 Messages postés lundi 27 mars 2006Date d'inscription 2 mars 2007 Dernière intervention - 1 mars 2007 à 14:40 - Dernière réponse : malalam 10918 Messages postés lundi 24 février 2003Date d'inscription 2 mars 2010 Dernière intervention
- 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
Afficher la suite 

13 réponses

Répondre au sujet
malalam 10918 Messages postés lundi 24 février 2003Date d'inscription 2 mars 2010 Dernière intervention - 1 mars 2007 à 19:33
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de malalam
syndrael 2382 Messages postés lundi 4 février 2002Date d'inscription 29 décembre 2012 Dernière intervention - 1 mars 2007 à 16:33
0
Utile
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.
Commenter la réponse de syndrael
cs_mfaraday 145 Messages postés vendredi 18 avril 2003Date d'inscription 4 janvier 2010 Dernière intervention - 1 mars 2007 à 18:05
0
Utile
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
Commenter la réponse de cs_mfaraday
escorizaweb 3 Messages postés lundi 27 mars 2006Date d'inscription 2 mars 2007 Dernière intervention - 1 mars 2007 à 19:18
0
Utile
Euhhhh j'ai testé et ça n'a pas l'air de me donner le classement...
Commenter la réponse de escorizaweb
weboide 30 Messages postés samedi 19 avril 2003Date d'inscription 13 mars 2007 Dernière intervention - 1 mars 2007 à 19:19
0
Utile
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?
Commenter la réponse de weboide
malalam 10918 Messages postés lundi 24 février 2003Date d'inscription 2 mars 2010 Dernière intervention - 1 mars 2007 à 19:34
0
Utile
Où 3  (joueur_id = 3) est à remplacer par l'id du joueur dont tu visualises la fiche, évidemment...
Commenter la réponse de malalam
escorizaweb 3 Messages postés lundi 27 mars 2006Date d'inscription 2 mars 2007 Dernière intervention - 2 mars 2007 à 00:53
0
Utile
Merci je vais tester cela...
Commenter la réponse de escorizaweb
syndrael 2382 Messages postés lundi 4 février 2002Date d'inscription 29 décembre 2012 Dernière intervention - 2 mars 2007 à 09:57
0
Utile
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.
Commenter la réponse de syndrael
malalam 10918 Messages postés lundi 24 février 2003Date d'inscription 2 mars 2010 Dernière intervention - 2 mars 2007 à 10:56
0
Utile
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 :-)
Commenter la réponse de malalam
syndrael 2382 Messages postés lundi 4 février 2002Date d'inscription 29 décembre 2012 Dernière intervention - 2 mars 2007 à 11:59
0
Utile
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.
Commenter la réponse de syndrael
malalam 10918 Messages postés lundi 24 février 2003Date d'inscription 2 mars 2010 Dernière intervention - 2 mars 2007 à 13:05
0
Utile
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.
Commenter la réponse de malalam
syndrael 2382 Messages postés lundi 4 février 2002Date d'inscription 29 décembre 2012 Dernière intervention - 2 mars 2007 à 15:30
0
Utile
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.
Commenter la réponse de syndrael
malalam 10918 Messages postés lundi 24 février 2003Date d'inscription 2 mars 2010 Dernière intervention - 2 mars 2007 à 16:23
0
Utile
(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...!
Commenter la réponse de malalam

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.