Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1470 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Fonction pour établir le classement d'un coureur

 

 

 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Fonction pour établir le classement d'un coureur

n°1917818
arges
Posté le 24-08-2009 à 13:21:33  profilanswer
 

Bonjour à vous,
 
Je cherche de l'aide car j'essaie de créer une fonction me permettant d'avoir le classement d'un nageur dans une course. J'ai voulu suivre ce qui était indiqué ici : http://forum.hardware.fr/hfr/Progr [...] 7577_1.htm
mais je me retrouve avec des petits écarts, certains coureurs sont à une place de plus tandis que d'autres sont bien placés. C'est très bizarre.
 
Voici ma fonction :  

Code :
  1. function Place ($id_nage, $temps) {
  2.  $query="SELECT DISTINCT COUNT(*) as position FROM competition1 WHERE id_nage='$id_nage' AND temps <  '$temps' ";
  3.  $tmp = mysql_fetch_array(mysql_query($query));
  4.  $classement = $tmp['position'] + 1;
  5.          return $classement;
  6.  }


 
Par avance merci beaucoup de votre aide.


Message édité par arges le 25-08-2009 à 12:38:55
mood
Publicité
Posté le 24-08-2009 à 13:21:33  profilanswer
 

n°1917822
infoman64
JE SUIS LA POUR TOI MON AMI
Posté le 24-08-2009 à 13:45:21  profilanswer
 

moi je dirais que ca vient de ta comparaison du temps
il faudrait pas mettre <= '$temps',
comme ca tu enleve ton +1, et tu as directement la position de ton coureur.

n°1917828
arges
Posté le 24-08-2009 à 14:06:58  profilanswer
 

Merci de me répondre.
Je pense également à un problème dans la comparaison du temps mais malheureusement le <= ne résous pas le problème.  
 
Et puis ça poserait un problème en cas d'égalité.
 
J'édite mon message :
La fonction qui compte le nombre total de participants ne pose pas de problème, ce qui confirmerait le problème de temps.


Message édité par arges le 24-08-2009 à 14:16:27
n°1917859
infoman64
JE SUIS LA POUR TOI MON AMI
Posté le 24-08-2009 à 14:54:19  profilanswer
 

Premierement
dans ta base le champ temps est ce au format date, ou un texte
si c'est format texte, regarde bien si il y a pas des problèmes d'espaces ou de date mal formé
 
Si c'est au format date, regarde si la valeur $temps que tu mets dans ta requete est au bon format et pas de caractères bizarres qui trainent

n°1917861
arges
Posté le 24-08-2009 à 15:12:20  profilanswer
 

C'est au format float en fait.
Au départ je l'extrais d'un fichier texte sous lequel c'est sous la forme mm.sscc  
Je l'ai laissé tel quel vu que je ne fais aucune opération sur les temps.
Ma boulette viendrait-elle de là?

n°1917887
infoman64
JE SUIS LA POUR TOI MON AMI
Posté le 24-08-2009 à 16:47:23  profilanswer
 

ah ok,  
désole, je sais pas pourquoi je pensais à un date moi, rien à voir,
 
peut tu me montrer un cas ou ca marche et un cas ou ca marche pas.(les temps je veut dire)
 
 

n°1917928
arges
Posté le 24-08-2009 à 20:55:26  profilanswer
 

Je viens de faire une capture d'écran de ma base de donnée
 
Quand j'ai écris (mauvaise place +1) c'est donc que la requête me renvoie un de plus que ce que ça devrait renvoyer normalement.
 
http://zepload.com/images/1251143208_bdd.png
 
J'ai également une fonction pour calculer le nombre total de participants qui est identique mais sans la condition de temps et celle-ci marche apparemment parfaitement.


Message édité par arges le 24-08-2009 à 21:00:47
n°1917972
infoman64
JE SUIS LA POUR TOI MON AMI
Posté le 25-08-2009 à 09:47:31  profilanswer
 

dans la base tout me semble correct,
je voit pas d'erreur.
Alors moi maintenant je pencherais sur la requete
montre moi la requete exécuté pour la ou il y a les mauvaise places
 
Une question pour le gars en 0.3861, quel est la place que te donne le resultat de ta fonction(normalement il devrait te renvoyer 5)
 

n°1917977
arges
Posté le 25-08-2009 à 10:18:24  profilanswer
 

Voici la requête correspondant à celui qui est en 0.3861 :

Code :
  1. SELECT DISTINCT COUNT(*) as position FROM competition1 WHERE id_nage='71' AND temps < '0.386100'


 
Cette requête donne 6.
 
Je n'avais pas fait gaffe hier mais le <= ne modifie pas le résultat de la requête. J'ai toujours 6 si je laisse le <= et le +1.
Sinon une requête en ajoutant une condition (par exemple la catégorie) donne un décalage identique. Ici la requête donne 2 (alors qu'il est premier de sa catégorie). Ca montrerait donc que le problème vient de son temps à lui et non du temps des autres mais comme ce temps n'a rien de particulier je suis toujours dans le brouillard.  
Epais de chez épais le brouillard  :??:  
 
Merci beaucoup de m'aider en tout cas.
 
 
Edit : j'ajoute aussi que lorsque je sors tous les résultats avec un ORDER BY temps, tous sont merveilleusement placés! (c'est vraiment bizarre  :??: )


Message édité par arges le 25-08-2009 à 10:29:11
n°1917985
pataluc
Posté le 25-08-2009 à 10:32:08  profilanswer
 

déja, le "DISTINCT COUNT(*)" à mon avis il sert à rien... si tu veux mettre un DISTINCT il faut le mettre dans le COUNT...
 
ensuite ton pb pourrais venir d'un problème de cast ou qqchose dans le genre... car tu as une valeur égale à celle de la requête dans ta table... tu as essayé d'enlever le count pour vérifier les champs qui te sont retournés?

mood
Publicité
Posté le 25-08-2009 à 10:32:08  profilanswer
 

n°1918032
arges
Posté le 25-08-2009 à 11:24:26  profilanswer
 

Effectivement je venais de voir que le distinct ne s'utilisait pas comme ça. Je l'ai enlevé.
 
Voici le résultat d'un var_dump sur la même requête (j'ai selectionné les 4 champs principaux)
 

Code :
  1. array(8) { [0]=> string(2) "71" ["id_nage"]=> string(2) "71" [1]=> string(1) "7" ["id_club"]=> string(1) "7" [2]=> string(1) "9" ["id_nageur"]=> string(1) "9" [3]=> string(6) "0.3861" ["temps"]=> string(6) "0.3861" } array(8) { [0]=> string(2) "71" ["id_nage"]=> string(2) "71" [1]=> string(1) "5" ["id_club"]=> string(1) "5" [2]=> string(1) "1" ["id_nageur"]=> string(1) "1" [3]=> string(6) "0.3826" ["temps"]=> string(6) "0.3826" } array(8) { [0]=> string(2) "71" ["id_nage"]=> string(2) "71" [1]=> string(1) "9" ["id_club"]=> string(1) "9" [2]=> string(1) "3" ["id_nageur"]=> string(1) "3" [3]=> string(6) "0.3839" ["temps"]=> string(6) "0.3839" } array(8) { [0]=> string(2) "71" ["id_nage"]=> string(2) "71" [1]=> string(1) "2" ["id_club"]=> string(1) "2" [2]=> string(1) "2" ["id_nageur"]=> string(1) "2" [3]=> string(5) "0.383" ["temps"]=> string(5) "0.383" } array(8) { [0]=> string(2) "71" ["id_nage"]=> string(2) "71" [1]=> string(1) "9" ["id_club"]=> string(1) "9" [2]=> string(1) "8" ["id_nageur"]=> string(1) "8" [3]=> string(6) "0.3776" ["temps"]=> string(6) "0.3776" }


 
J'ai donc l'impression qu'il compte l'enregistrement lui-même, alors que cette requête a été effectuée sans le <=.
 
Voici la fonction qui a permis d'avoir ce var_dump :  
 

Code :
  1. function Place ($id_nage, $temps, $id_categorie) {
  2.  if ($temps == 0.3861) $test=1;
  3.  else $test=0;
  4.  $query="SELECT id_nage, id_club, id_nageur, temps FROM competition1 WHERE id_nage='$id_nage' AND temps < '$temps'";
  5.  if ($test==1) {
  6.   $tmp = mysql_query($query);
  7.   while ($test2=mysql_fetch_array($tmp)) {
  8.    var_dump($test2);
  9.   }
  10.   }
  11. // $nombre_participants=mysql_fetch_array(mysql_query($query));  
  12. // $nombre_participants = $nombre_participants['position'] + 1;
  13. // return $nombre_participants;
  14.  }


 
Le temps qui sert d'argument à la fonction sort en fait d'une table identique ou quasiment identique.


Message édité par arges le 25-08-2009 à 11:27:18
n°1918037
infoman64
JE SUIS LA POUR TOI MON AMI
Posté le 25-08-2009 à 11:37:22  profilanswer
 

SELECT COUNT(*) as position FROM competition1 WHERE id_nage='71' AND temps < '0.386100'
 
si tu prends cette requete et que tu l'execute directement dans phpmyadmin  
qu'est ce qu'il te renvoie?

n°1918043
arges
Posté le 25-08-2009 à 11:47:36  profilanswer
 

Il me renvoie :  
position
5
 
Donc également un de trop :(

n°1918050
pataluc
Posté le 25-08-2009 à 12:07:39  profilanswer
 

et si tu mets la même chose sans le '00' à la fin du temps?

n°1918052
arges
Posté le 25-08-2009 à 12:15:16  profilanswer
 

Ok super je crois avoir trouvé! J'ai vu qu'il y avait des discussions similaires dans les forums de c/c++  
 
Difficile pour moi de l'expliquer vu mes connaissances. Apparemment il existerait une très petite marge d'erreur liée à l'enregistrement des float (ce qui expliquerait qu'il considère que 0.3861 peut être inférieur à 0.3861  :??: )
 
J'ai donc remplacé ma condition par  

Code :
  1. AND ('$temps' - temps) >=  '$erreur'


 
où dans mon cas erreur vaut 0.0001 puisque je ne peux pas avoir d'écart en millièmes mais pourrait être largement plus petit. Il faut que je regarde attentivement mais apparemment ça marche. J'espère vraiment que tout est bon.
 
Si quelqu'un connait ce genre de solution et peut me confirmer que tout est exact, ça m'enlèverait un poids avant de terminer mon projet.
 
En tout cas un grand merci à vous infoman64 et pataluc, c'est vraiment très sympa de votre part d'avoir passé tout ce temps à m'aider.
 


Message édité par arges le 25-08-2009 à 12:36:56
n°1918079
infoman64
JE SUIS LA POUR TOI MON AMI
Posté le 25-08-2009 à 14:00:58  profilanswer
 

va trouver l'erreur quoi!!
mais c'est bon a savoir!!!


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Fonction pour établir le classement d'un coureur

 

Sujets relatifs
[VBA] Programmer un indicateur coloré en fonction d'une valeurfonction SQL qui fonctionne impec sous phpmyadmin mais pas en php !
Fonction window.open (javascript)Allocation d'un tableau dans une fonction
[Batch]Ajout de fonction Windowsaccès à fonction importée à accè à fonction importé.
Fonction mail OK en ligne de commande php, KO par le WebFonction qui retourne une structure
(javascript) retarder le lancement d'une fonctionC++ fonction d'une ligne : besoin d'accolades ?
Plus de sujets relatifs à : Fonction pour établir le classement d'un coureur


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR