Nazario Posté 5 Août 2007 Posté 5 Août 2007 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,
TheRec Posté 5 Août 2007 Posté 5 Août 2007 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.
Nazario Posté 6 Août 2007 Auteur Posté 6 Août 2007 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,
sparh Posté 7 Août 2007 Posté 7 Août 2007 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.
fingolfin Posté 7 Août 2007 Posté 7 Août 2007 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.
Nazario Posté 7 Août 2007 Auteur Posté 7 Août 2007 On va dire que je considérais cette option comme "choix de secours". J'étais persuadé qu'on pouvait faire ça via mySQL. Cordialement,
TheRec Posté 7 Août 2007 Posté 7 Août 2007 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
Nazario Posté 7 Août 2007 Auteur Posté 7 Août 2007 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.
sparh Posté 8 Août 2007 Posté 8 Août 2007 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
TheRec Posté 8 Août 2007 Posté 8 Août 2007 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.
sparh Posté 8 Août 2007 Posté 8 Août 2007 (modifié) Salut et merci de m'aider. Donc je vais être plus précis: $poi = $data['point'];//je vérifiecho $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é 8 Août 2007 par sparh
Nazario Posté 8 Août 2007 Auteur Posté 8 Août 2007 Et si tu mets: $classem = $classem['rang']; Avant ton echo ? Ca fonctionnerait pas mieux ?
TheRec Posté 8 Août 2007 Posté 8 Août 2007 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.
TheRec Posté 8 Août 2007 Posté 8 Août 2007 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
Nazario Posté 8 Août 2007 Auteur Posté 8 Août 2007 Pour ma pars, ce n'était pas mon attention non plus.
sparh Posté 9 Août 2007 Posté 9 Août 2007 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
sparh Posté 10 Août 2007 Posté 10 Août 2007 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
TheRec Posté 10 Août 2007 Posté 10 Août 2007 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
sparh Posté 10 Août 2007 Posté 10 Août 2007 (modifié) 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é 10 Août 2007 par sparh
TheRec Posté 10 Août 2007 Posté 10 Août 2007 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
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant