escorizaweb
Messages postés3Date d'inscriptionlundi 27 mars 2006StatutMembreDernière intervention 2 mars 2007
-
1 mars 2007 à 14:40
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDerniè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,
syndrael
Messages postés2378Date d'inscriptionlundi 4 février 2002StatutMembreDernière intervention29 décembre 201220 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.
cs_mfaraday
Messages postés144Date d'inscriptionvendredi 18 avril 2003StatutMembreDerniè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
weboide
Messages postés30Date d'inscriptionsamedi 19 avril 2003StatutMembreDernière intervention13 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.
syndrael
Messages postés2378Date d'inscriptionlundi 4 février 2002StatutMembreDernière intervention29 décembre 201220 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.
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 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 :-)
syndrael
Messages postés2378Date d'inscriptionlundi 4 février 2002StatutMembreDernière intervention29 décembre 201220 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.
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 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.
syndrael
Messages postés2378Date d'inscriptionlundi 4 février 2002StatutMembreDernière intervention29 décembre 201220 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.