Aller au contenu

Sortir le n° du rang d'un classement


Nazario

Sujets conseillés

Bonjour,

En fait, j'ai une table mySQL avec plusieurs champs dont "note".

J'aimerais donc ainsi ressortir le rang d'un enregistrement dans le classement des notes en ordre croissant.

Par exemple, si un enregistrement à une note comme 5/5, j'aimerais qu'on me ressorte que c'est le premier.

J'ignore comment m'y prendre, merci de m'éclaircir :)

Cordialement,

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir,

Si tu veux que le plus "grand" soit en premier c'est l'ordre décroissant que tu souhaite utiliser, pas l'ordre croissant.

Pour classer les résultats d'une requête tu dispose de la clause ORDER BY en l'occurrence cela donnerait :

SELECT * FROM ta_table ORDER BY node DESC

DESC sert à indiquer l'ordre décroissant et s'applique au champ qui le précède. Tu peux spécifier plus d'un champ (et un ordre différent pour chaque champ) et dans ce cas la position de ces champs indique leur priorité.

Bonne continuation.

Lien vers le commentaire
Partager sur d’autres sites

Oui d'accord, je sais comment sortir le classement par ordre décroissant, mais comment savoir comment ressortir le numéro de rang de ma réponse.

Par exemple, avec une table comme celle-ci:

ID - Nom - Note

1 - Jacques - 6

2 - Jean - 24

3 - Robert - 85

4 - Marcel - 3

5 - Yves - 35

J'aimerais afficher, via requete, que Jean est le troisième et/ou que Yves est 2ème.

Il y a t-il une requete mySQL pour ressortir le rang ou faut-il procéder autrement ?

Cordialement,

Lien vers le commentaire
Partager sur d’autres sites

Juste pour dire que moi aussi je cherche à faire ça, si quelqu'un a une solution à nous proposer ;)

Merci d'avance

En fait il faudrai 2 requètes

La première qui sort le classement (ça c'est ok)

La seconde qui va sortir la position de tel ou tel nom (dans le classement), c'est là que je ne vois pas comment faire.

Lien vers le commentaire
Partager sur d’autres sites

Vous voulez le rang d'un type selon sa note ou son id ? Si c'est son id il vous suffit de la sétionner, si c'est la note bah vous sélectionner le tout et vous faites ça à la main avec PHP dans une boucle.

Lien vers le commentaire
Partager sur d’autres sites

On va dire que je considérais cette option comme "choix de secours".

J'étais persuadé qu'on pouvait faire ça via mySQL.

Cordialement,

Lien vers le commentaire
Partager sur d’autres sites

Pardon j'avais mal compris ta question. En fait en comptant le nombre distinct d'enregistrement tu peux connaître ce rang. Il y a deux façons de faire, soit tu considère que les personnes à égalité on le même rang, soit tu considères qu'ils ont un rang différent et tu leur attribue ce rang en fonction d'autres paramètres (par défaut le code suivant les classera en fonction de l'ordre dans lequel les enregistrements auront étés ajoutés si tu enlève le DISTINCT).

Partons du principe que les gens à égalité on le même rang, c'est le cas le plus simple :

SELECT DISTINCT COUNT(*) AS rang FROM ta_table WHERE note <= <note_utilisateur_ici>

En espérant que cette fois j'aie bien compris ta demande ;)

Lien vers le commentaire
Partager sur d’autres sites

Tu as bien compris la question :)

Je me doutais bien qu'il y avait un moyen de faire ceci.

Merci du coup d'main!

Bonne continuation.

Lien vers le commentaire
Partager sur d’autres sites

Salut,

je n'ai pas initié cette discussion mais je suis très intéressé par ce type de requête et ... je n'y arrive pas!

Donc prenons la table exemple de Nazario ci dessous avec le postulat de TheRec (qui me convient très bien: 2 membres avec la même note auront la même position dans le classement)

Partons du principe que les gens à égalité on le même rang, c'est le cas le plus simple :

Par exemple je veux sortir le rang de Jean.

La requête doit donc me sortir: 3

Et bien je n'y arrive pas!!!!

Merci d'avance pour votre aide ;)

Lien vers le commentaire
Partager sur d’autres sites

C'est un peu court comme description du problème qui te préoccupe, "je n'y arrive pas"... je veux bien t'aider mais dans plus de détails je ne vois pas comment le faire. Personnellement si j'exécute la requête suivante :

SELECT DISTINCT COUNT(*) AS rang FROM ta_table WHERE note <= 24

"24" étant la note de "Jean" (je n'ai pas remis le ORDER BY car en fait il est inutile dans cette requête, c'est le reste d'une autre requête que j'avais testé, j'ai édité mon message précédent également dans ce sens), j'obtiens bien "3" comme résultat à cette requête.

Lien vers le commentaire
Partager sur d’autres sites

Salut et merci de m'aider.

Donc je vais être plus précis:

$poi = $data['point'];
//je vérifi
echo $point;

$classement ="SELECT DISTINCT COUNT(*) AS rang FROM membre WHERE point = '$point'";
$req= mysql_query($classement ) or die('Erreur SQL !<br>'.$classement .'<br>'.mysql_error());

$classem = mysql_fetch_array($req);

mysql_free_result($req);

echo $classem;

Et ça m'affiche: Array !

Merci d'avance ;)

Modifié par sparh
Lien vers le commentaire
Partager sur d’autres sites

Effectivement... et c'est "<=" et non juste "=" dans la requête SQL. Si tu utilise "=" tu va obtenir le nombre de personne avec la même note.

Et comme l'a dit Nazario, mysql_fetch_array retourne un tableau (d'où "Array")... Si tu veux récupérer un seul champ dans une variable utiliser mysql_result.

 $classem = mysql_result($req,0);

Le "0" étant pour indiquer à la fonction de retourner le premier champ.

Lien vers le commentaire
Partager sur d’autres sites

Pourquoi un "guignol" ? J'espère que nos réponses ne te font pas ressentir ceci, en tout cas pour ma part ce n'est pas mon intention. J'essayais juste d'être le plus complet possible.

Bonne continuation :)

P.S. : Selon moi l'adage commençant par "Il n'y a pas de question bête" est toujours vrai... et quand bien même il y en aurait, elles ne récolteraient pas beaucoup de réponses ;)

Lien vers le commentaire
Partager sur d’autres sites

;)

Non ce ne sont pas vos réponses qui me font penser ça.

C'est juste que ce n'étais pas très compliqué (en tous cas pour ma dernière question).

Encore merci à tous les 2

Lien vers le commentaire
Partager sur d’autres sites

Salut,

je reviens à la charge car en faisant des tests je n'obtiens pas un classement valide:

exemple de table:

# +--------+-------+
# | pseudo | point |
# +--------+-------+
# | toto | 5 |
# | titi | 5 |
# | pom | 4 |
# | tata | 4 |
# | jojo | 2 |
# +--------+-------+

requête:

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

Le problème apparait quand il y a 2 membres (ou plus) qui on le même nombre de points

Avec cette requête voici ce qu'on obtient:

titi --> 2

toto --> 2

pom --> 4

tata --> 4

jojo --> 5

j'aimerai avoir

titi --> 1

toto --> 1

pom --> 2

tata --> 2

jojo --> 3

J'ai éssayé plusieurs variantes de la requête et c'est cette solution qui se rapproche le plus du "bon" classement.

Une idée ;)

Lien vers le commentaire
Partager sur d’autres sites

En fait, après réflexion la requête que je vous ai donné ne donne pas les résultats escomptés. En revanche je n'ai jamais utilisé ">=" dans mes requêtes donc je ne sais pas d'où tu sors ceci sparh, d'ailleurs mes requêtes ne retournaient qu'un seul résultat à chaque fois (pour une notre -> un rang), mais passons vu que de toute façon ma requête était erronée.

Bref, après réflexion voici une requête qui marche et qui cette fois donne le classement au complet avec pour chaque enregistrement son rang :

SELECT *, (SELECT COUNT(DISTINCT(a.note))+1 AS rang FROM ta_table AS a WHERE a.note < b.note) AS rang FROM ta_table AS b

Il faut encore préciser une chose, ce classement fonctionne lorsque le champ "note" est un entier, simplement parce que le classement d'entiers ou de chaînes de caractères diffère. Donc lorsque tu fait "point >= '$point'" tu sembles vouloir comparer deux chaînes et non deux entiers. Car pour des chaînes de caractères "24", par exemple, est plus petit que (<) la chaîne "3" (à moins d'utiliser un tri dit "par ordre naturel" qui corrige justement ce comportement). Dans la requête qui nous préoccupe cela a tout son importance ;)

Pour obtenir uniquement le rang d'une note il suffit de ne conserver que la sous-requête et à la place de b.note placer la valeur de la notre à comparer.

Mes excuses pour la fausse requête que je vous avais donnée, je ne l'ai pas assez testée assez avant de la poster :)

Lien vers le commentaire
Partager sur d’autres sites

En fait, après réflexion la requête que je vous ai donné ne donne pas les résultats escomptés. En revanche je n'ai jamais utilisé ">=" dans mes requêtes donc je ne sais pas d'où tu sors ceci sparh, d'ailleurs mes requêtes ne retournaient qu'un seul résultat à chaque fois (pour une notre -> un rang),

J'ai éxécuté 3 fois la requête pour avoir les 3 résultats ;)

J'ai changer < par > car pour moi celui qui a la meilleure note est 1er.

d'ailleurs mes requêtes ne retournaient qu'un seul résultat à chaque fois (pour une notre -> un rang)

C'est exactement ce que je recherche

Donc j'ai adapté ta requête comme tu le dis:

voilà ce que ça donne:

$classement = "SELECT COUNT(DISTINCT(a.note))+1 AS rang FROM membre AS a WHERE a.note > $notee";

Apparement ca marche, en tous cas pour la table citée plus haut le classement est correct.

Là je pars en week end, donc je ne vai pas pouvoir faire beaucoup de tests.

Je bookmark ce post et je reviens la semaine prochaine ;)

Un grand merci pour ton aide et ta patience.

Modifié par sparh
Lien vers le commentaire
Partager sur d’autres sites

Ton adaptation est correcte, note que tu n'est pas obligé d'utiliser d'alias (<expr> AS <alias>) dans ce cas. Donc tu peux même la simplifier en :

$classement = "SELECT COUNT(DISTINCT(note))+1 AS rang FROM membre WHERE note > $notee";

À priori cela ne change pas grand chose, mais c'est toujours une variable de moins à stocker pour MySQL lorsqu'il exécute ta requête.

Et de rien, ce fut aussi l'occasion d'apprendre des choses pour moi donc tout le monde y gagne ;)

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...