Fonction pour établir le classement d'un coureur

Fonction pour établir le classement d'un coureur - SQL/NoSQL - Programmation

Marsh Posté le 24-08-2009 à 13:21:33    

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
Reply

Marsh Posté le 24-08-2009 à 13:21:33   

Reply

Marsh Posté le 24-08-2009 à 13:45:21    

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.

Reply

Marsh Posté le 24-08-2009 à 14:06:58    

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
Reply

Marsh Posté le 24-08-2009 à 14:54:19    

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

Reply

Marsh Posté le 24-08-2009 à 15:12:20    

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à?

Reply

Marsh Posté le 24-08-2009 à 16:47:23    

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)
 
 

Reply

Marsh Posté le 24-08-2009 à 20:55:26    

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
Reply

Marsh Posté le 25-08-2009 à 09:47:31    

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)
 

Reply

Marsh Posté le 25-08-2009 à 10:18:24    

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
Reply

Marsh Posté le 25-08-2009 à 10:32:08    

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?

Reply

Marsh Posté le 25-08-2009 à 10:32:08   

Reply

Marsh Posté le 25-08-2009 à 11:24:26    

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
Reply

Marsh Posté le 25-08-2009 à 11:37:22    

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?

Reply

Marsh Posté le 25-08-2009 à 11:47:36    

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

Reply

Marsh Posté le 25-08-2009 à 12:07:39    

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

Reply

Marsh Posté le 25-08-2009 à 12:15:16    

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
Reply

Marsh Posté le 25-08-2009 à 14:00:58    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed