Rang d'un enregistrement MySQL [Résolu]

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

Votre réponse

13 réponses

Meilleure réponse
Messages postés
10918
Date d'inscription
lundi 24 février 2003
Dernière intervention
2 mars 2010
1 mars 2007 à 19:33
3
Merci
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

Merci malalam 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

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