Sql : rang dans un classement

Répondre
sparh
le 08/08/2007 à 10:36
sparh
Bonjour ;)

Je n'arrive pas à sortir le rang dans un classement.
J'ai cherché dans gg mais j'ai rien trouvé qui m'aide.

Donc j'ai une table x avec les colonnes membre et point.

Ce que j'aimerai c'est trouver le rang de tel ou tel membre dans le classement (en fonction de la colonne point).

Voilà, merci d'avance pour votre aide ;)
LA GLOBULE
le 08/08/2007 à 10:40
LA GLOBULE
Plusieurs solutions :
- créer un champ "rang" que tu mettras à jour
- sélectionner tes membres avec un ORDER BY point DESC, puis déterminer le rang en PHP

...
sparh
le 08/08/2007 à 11:34
sparh
;)
merci pour ces pistes:
pour la 1ère solution, c'est impossible, il y a des milliers de membres et chaque membre à des points en plus / en moins plusieurs fois par jour.

La seconde me parait plus faisable, je vai travailler la dessus mais à priori je ne vois pas comment
"déterminer le rang en PHP".
LA GLOBULE
le 08/08/2007 à 11:45
LA GLOBULE
Et bien, quand tu fais un while pour lister les divers membres, tu incrémentes une variable $i en partant de 1 au premier membre.

Comme çà, au membre x, tu auras son rang dans $i.

De toutes façons, niveau optimisations, tu ne pourras pas faire grand chose si tu ne stockes pas le rang dans un champ SQL : en effet, quoi qu'il arrive, tu devras scanner tous les membres pour connaitre leur rang.
Bzh
le 08/08/2007 à 20:16
Bzh
Si, tu peux optimiser en utilisant une autre table qui ne gérera QUE le rang !

En tout cas, je ferai ça comme ça !
LA GLOBULE
le 08/08/2007 à 20:47
LA GLOBULE
Oui, si on stocke le rang dans une table, c'est optimisable, mais si il ne le fait pas, non.
sparh
le 09/08/2007 à 12:19
sparh
Pour info:

voici ce qu'on m'a proposé sur le hub et qui marche:
$classement ="SELECT DISTINCT COUNT(*) AS rang FROM membre WHERE point = '$point'";


Ca me sort le rang du membre qui a $point.
Bzh
le 09/08/2007 à 20:06
Bzh
Oui ! Mais c'est lourd comme requete !

Enfin, c'est à voir...
LA GLOBULE
le 09/08/2007 à 20:27
LA GLOBULE
C'est faux ton truc sparh.

mysql> SELECT * FROM test;
+--------+-------+
| pseudo | point |
+--------+-------+
| toto | 5 |
| titi | 5 |
| pom | 4 |
+--------+-------+
3 rows in set (0.00 sec)

mysql> SELECT DISTINCT COUNT(*) AS rang FROM test WHERE point ='5';
+------+
| rang |
+------+
| 2 |
+------+
1 row in set (0.00 sec)

mysql> SELECT DISTINCT COUNT(*) AS rang FROM test WHERE point ='4';
+------+
| rang |
+------+
| 1 |
+------+
1 row in set (0.00 sec)


Le membre qui a 5 points a soit disant un rang 2. Or on a deux membres qui ont 5 points. ils ont les rangs 1 et 2.
Et le membre qui a 4 points n'est pas au rang 1, mais au rang 3.

Ou alors, on a pas la même notion de rang, et tu nous as mal exposé ton problème.
sparh
le 10/08/2007 à 09:37
sparh
Salut,
il y avait une petite erreur dans ma requête:
ce n'est pas
$classement ="SELECT DISTINCT COUNT(*) AS rang FROM membre WHERE point = '$point'";

Mais
$classement ="SELECT DISTINCT COUNT(*) AS rang FROM membre WHERE point >= '$point'";


Mais ça pose problème avec les scores identiques en effet.

Avec cette dernière requête et ton exemple voici ce qu'on obtient:
titi --> 2
toto --> 2
pom --> 3

En effet ce n'est pas juste:
j'aimerai avoir
titi --> 1
toto --> 1
pom --> 2

Une idée ?
Répondre
LoadingChargement en cours