Sql : rang dans un classement

page 1 page 2
Répondre
sparh
sparh
Déconnecté
Webmaster en herbe
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
LA GLOBULE
Déconnecté
111 111 111 x 111 111 111 = 12 345 678 987 654 321
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
sparh
Déconnecté
Webmaster en herbe
;)
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
LA GLOBULE
Déconnecté
111 111 111 x 111 111 111 = 12 345 678 987 654 321
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
Bzh
Déconnecté
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
LA GLOBULE
Déconnecté
111 111 111 x 111 111 111 = 12 345 678 987 654 321
Oui, si on stocke le rang dans une table, c'est optimisable, mais si il ne le fait pas, non.
sparh
sparh
Déconnecté
Webmaster en herbe
Pour info:

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


Ca me sort le rang du membre qui a $point.
Bzh
Bzh
Déconnecté
Oui ! Mais c'est lourd comme requete !

Enfin, c'est à voir...
LA GLOBULE
LA GLOBULE
Déconnecté
111 111 111 x 111 111 111 = 12 345 678 987 654 321
C'est faux ton truc sparh.

  1. mysql> SELECT * FROM test;
  2. +--------+-------+
  3. | pseudo | point |
  4. +--------+-------+
  5. | toto | 5 |
  6. | titi | 5 |
  7. | pom | 4 |
  8. +--------+-------+
  9. 3 rows in set (0.00 sec)
  10.  
  11. mysql> SELECT DISTINCT COUNT(*) AS rang FROM test WHERE point ='5';
  12. +------+
  13. | rang |
  14. +------+
  15. | 2 |
  16. +------+
  17. 1 row in set (0.00 sec)
  18.  
  19. mysql> SELECT DISTINCT COUNT(*) AS rang FROM test WHERE point ='4';
  20. +------+
  21. | rang |
  22. +------+
  23. | 1 |
  24. +------+
  25. 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
sparh
Déconnecté
Webmaster en herbe
Salut,
il y avait une petite erreur dans ma requête:
ce n'est pas
  1. $classement ="SELECT DISTINCT COUNT(*) AS rang FROM membre WHERE point = '$point'"; 

Mais
  1. $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 ?
sparh
sparh
Déconnecté
Webmaster en herbe
Voilà la bonne, j'ai fait 2-3 tests rapides et ça marche:
  1. $classement = "SELECT COUNT(DISTINCT(a.point))+1 AS rang FROM membre AS a WHERE a.point > $point"; 


Pour être honnète là j'y comprends plus grand chose! Mais ça marche ;)
Bzh
Bzh
Déconnecté
Mouai...
LupusMic
LupusMic
Déconnecté
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
Je vais essayer d'être plus concret que Bzh ;)

Le classement sera, dans un temps plus ou moins éloigné, faux. Ce n'est pas parce que le code est faux, c'est simplement parce que ton site est multi-utilisateur.

Personnellement, je suis partisant de faire le maximum en base de données, pour éviter les incohérences de données. Si tu ne fais pas comme ça, tu dois locker la table pendant que tu traites les données, pour t'assurer de la cohérence de la base.

Mais locker, c'est mal ©. Pour plein de raison que je ne vais pas exposer ici, mais locker une table rime avec deadlock et indisponibilité. Bon, maintenant, si t'as pas le choix, t'as pas le choix ;)
mojorisin
mojorisin
Déconnecté
echo ’16i[q]sa[ln0=aln100%Pln100/snlbx]sbA0D4D465452snlbxq’|dc
Salut
voila une solution :
  1.  
  2. SET @pos :=0;
  3. SET @last := NULL;
  4. SELECT pseudo, point,IF(@last = point,@pos := @pos,@pos := @pos+1) AS position,@last:= point
  5. FROM test
  6. ORDER BY point ASC;
  7.  
  8. +----------+-------+----------+---------------+
  9. | pseudo | point | position | @last:= point |
  10. +----------+-------+----------+---------------+
  11. | pseudo 1 | 2 | 1 | 2 |
  12. | pseudo 6 | 2 | 1 |2 |
  13. | pseudo 4 | 4 | 2 | 4 |
  14. | pseudo 2 | 6 | 3 | 6 |
  15. | pseudo 5 | 6 | 3 | 6 |
  16. | pseudo 3 | 8 | 4 | 8 |
  17. +----------+-------+----------+---------------+
  18.  
  19.  
sparh
sparh
Déconnecté
Webmaster en herbe
Bzh --> C'est à dire ???

LupusMic --> Ce que tu dis: pendant qu'un membre affiche le rang un autre peut ajouter / retirer des points ce qui fausse le classement. Il faudrai donc bloquer la colonne point quand on affiche le rang . C'est bien ça??

mojorisin --> je vai tester ton truc, si je comprends bien, tu crée une colonne virtuelle qui contient la classement.

Merci d'avance à tous pour vos avis et réponse;)
page 1 page 2
Répondre
Accès rapide :

Remonter Remonter
L'éditeur javascript - CSS - Gentoo - Tutoriaux PHP - Tutoriels PHP - Breizh Blog