Sql : rang dans un classement
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 ;)
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
...
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".
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.
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 !
Oui, si on stocke le rang dans une table, c'est optimisable, mais si il ne le fait pas, non.
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.
le 09/08/2007 à 20:06
Bzh
Oui ! Mais c'est lourd comme requete !
Enfin, c'est à voir...
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.
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 ?