Bonjour,
je poursuis le développement d'un plugin galette dont je parlais ici il y a peu.
J'ai besoin de vos lumières pour réaliser un petit truc pas très complique: un challenge vitesse.
Le principe est simple, en fonction d'un temps réalisée, un athlète se voit attribuer un nombre de points par rapport a un temps de référence (de 0 à 10points).
Là où cela se complique, c'est que bien évidemment, d'autres critères entre en jeu: la catégorie de l’athlète (un bonus est attribué en fonction de l'âge), le sexe (la référence varie d'un sexe à l'autre) et la distance.
Actuellement, une allure « étalon » est utilisée:
- 4'20/km pour les femmes (soient 260 secondes)
- 3'30/km pour les hommes (soient 210 secondes)
À partir de là sont déclinés des matrices pour réaliser le calcul final selon un la méthode suivante:
SI Dist_en_km > 10 ALORS
Temps_pour_10pts = temps_etalon + (Dist_enkm-10)*(Dist_enkm-10)
SINON
Temps_pour_10pts = temps_etalon - (Dist_enkm-10)*(Dist_enkm-10)
Ensuite, cette valeur permet de construire le Temps_pour_avoir_9pts
qui lui-même permet d'avoir celui pour 8, etc.
En gros:
Pour attribuer les points, il suffit alors de comparer le temps de l'athlète et de faire une somme.
temps_pour_9pts = temps_pour_10pts * 1,03
temps_pour_8pts = temps_pour_9pts * 1,03
temps_pour_7pts = temps_pour_8pts * 1,03
.
.
.
Pour couper court aux questions sur les valeurs choisies, disons que c'est ainsi.
Ce que je cherche à faire, c'est construire un tableau de référence pour ne pas avoir à la calculer à chaque fois.
Comment vous y prendriez-vous sachant que je suis sur du PHP + MySQL ?
Actuellement, tout est fait en PHP mais je sens qu'une bonne partie pourrait être mise dans une table MySQL.
Votre avis ?
# reponse dans ta question
Posté par NeoX . Évalué à 2. Dernière modification le 15 mai 2019 à 07:27.
tu peux donc faire, au choix du concepteur,
une table par categorie scoring_home, scoring_femme
que tu remplis avec tes valeurs calculées
et ta requete va allors chercher le resultat dans la table en fonction de la categorie
soit tu fait une table scoring, dans laquelle tu mets tous, avec un colonne "categorie"
pour avoir tes criteres homme/femme/enfants <10ans/enfants 10 à 15/ ados /veteran/
# pourquoi ne pas créer une fonction Mysql qui fait ce calcul?
Posté par Nodeus . Évalué à 1.
Dans ton cas le plus simple est de créer une fonction dans mysql qui fait le calcul à laquelle tu peux passer le temps de référence et l'argument de ditance en argument.
Pour les paramètres tu peux les rentrer dans une table.
comme ça pour faire ton calcul tu n'auras qu'a appeler la fonction.
et tu pourras construire une vue bdd qui te donneras tes résultats actualisés. un simple select en php te permettra ensuite d'afficher les résultats.
l'avantage de cette solution c'est que c'est le moteur BDD qui travaille et ça sera rapide facilement paramétrable.
tu peux retrouver les éléments pour créer les fonctions dans le manuel de mysql.
manuel mysql
[^] # Re: pourquoi ne pas créer une fonction Mysql qui fait ce calcul?
Posté par Xavier Maillard . Évalué à 1.
Ta solution est intéressante.
De quoi parles-tu exactement ? Des valeurs étalons ou de l'ensemble des valeurs ? -i.e temps_9pts, etc. ?
L’idée d'une fonction m'a traversé l'esprit et d'une vue. C'est ce que je fais pour un autre challenge (challenge distance) que je construis de cette manière. Afficher le résultat du challenge ne revient qu'a un simple select dans PHP.
[^] # Re: pourquoi ne pas créer une fonction Mysql qui fait ce calcul?
Posté par Nodeus . Évalué à 1.
Je parlais des paramètres de la fonction car la notion : Tout ce qui ne varie pas.
Mais ça peut aussi vouloir dire un jeu de données étalon utilisé comme référentiel de comparaison.
mais pour ce type de donnée je ferai une table spécifique.
[^] # Re: pourquoi ne pas créer une fonction Mysql qui fait ce calcul?
Posté par Xavier Maillard . Évalué à 1.
Je dois être un peu dur de la comprenite. Peux-tu me faire ca en pseudo-code avec un exemple ?
[^] # Re: pourquoi ne pas créer une fonction Mysql qui fait ce calcul?
Posté par Nodeus . Évalué à 1.
non je ne crois pas mais, il faudrait pour cela avoir une description complète de ton besoin avec formule de calcul car pour le moment je n'ai pas assez d'éléments pour te donner une piste précise.
notamment pour ce point
[^] # Re: pourquoi ne pas créer une fonction Mysql qui fait ce calcul?
Posté par Xavier Maillard . Évalué à 1. Dernière modification le 17 mai 2019 à 13:51.
Je pense que la description que j'ai faite est assez précise.
Une allure (F ou M) qui sert de "constante" pour construire une table de temps (en secondes). Pour avoir le max de point (10), il faut avoir un temps ≤ à la ref. Le temps pour avoir 9 points est construit sur la base du calcul du "temps pour 10 points" * 1,03 etc.
Une fois qu'on a cela, le challenge pour un athlète sur une année sportive c'est la somme des points qu'il a accumulé.
[^] # Re: pourquoi ne pas créer une fonction Mysql qui fait ce calcul?
Posté par Nodeus . Évalué à 1.
oui pour toi qui baigne dans le sujet
Qu'est ce qu'une allure ça se représente comment ?
c'est un un entier un nombre décimal, un réel.
cela représente quelle type de grandeur une vitesse une durée et dans quelle unité s'exprime cette constante.
Quelle formule dois-je utiliser pour construire cette table de temps en seconde.
ici c'est clair je prends un temps dans le tableau de références et tu compares au temps de la personne et en fonction du ratio de temps il est classé dans une des 10 notes.
Question : si le temps de la personne ne rentre pas dans le tableau par exemple inférieur à la note 0?.
que dois-je faire. Claquer une exception pour signifier hors catégorie ou le mettre dans la case 0 ?
Quels points faut-il cumuler ?
donc il faut faire le calcul à partir de quels résultats enregistrés.
Je suis un peu tatillon mais il faut toutes ces réponses pour créer
une réponse cohérente à ton problème.
Je pense qu'en y répondant ça te donnera une image plus claire également.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.