|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : décembre 2012 Messages : 38 ![]() |
Bonjour,
Je me permet de poser ma question ici apres capitulation.. Dans le cadre d'un college, j'éssaie via mysql de faire une requete permetant : de lister toutes les notes des éleves du college et de les trier en pourcentage du plus proche(en terme d écart) au plus grand d'un eleve donné ! jai 2 colonne dans ma base. prenom et note. Si on prend nicolas, il a 16(demoyenne generale) , si un autre eleve à 16 dans le college il aura 100% et sera donc en premier resultat de la recherche. Si en plus on pouvait exclure du résultat de la recherche celui de l'éleve donné (en l'occurence nicolas) ce serait magique mais j'en suis pas la.. Merci à ceux qui voudrons bien se pencher sur mon probleme Jess |
|
|
00
|
|
|
#2 |
![]() ![]() |
Il faut décomposer ton problème.
Commence par faire une requête qui cherche la plus grande note de l'élève choisi pour référence. Fais une autre requête qui donne la liste de toutes les notes des élèves sauf celui en référence. Dans la requête finale, fais un produit cartésien (FULL OUTER JOIN) entre les deux requêtes, ce qui te permettra de calculer le pourcentage de toutes les notes par rapport à celle de référence puis trie par ordre décroissant ce ratio.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise la suite Linux Mageïa ! |
|
00
|
|
|
#3 | |||||
|
Invité de passage
![]() Inscription : décembre 2012 Messages : 38 ![]() |
Merci pour la réponse,
Citation:
Citation:
Code :
Citation:
|
|||||
|
|
00
|
|
|
#4 | |||||||||||||
![]() ![]() |
Tu sélectionnes une colonne ELEVES (qui devrait être nommée au singulier
Citation:
C'est le même principe cependant. Je reste avec la structure de table que tu as donnée et je reprends mon descriptif de la solution... Citation:
Code :
Citation:
Code :
Citation:
Code :
Citation:
Code :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise la suite Linux Mageïa ! |
|||||||||||||
|
00
|
|
|
#5 | |||
|
Invité de passage
![]() Inscription : décembre 2012 Messages : 38 ![]() |
Merci de maider cinephil
Citation:
Dapres ta réponse, jai déja vu les AS pour utiliser des alias mais je ne sais pas à quoi corresponde les tmp. ou c. Jai testé ton code sous cette forme dans mon code php mais n'ayant point l'habitude de requetes complexes, jai du fautée dans la syntaxe ou autre, jai donc fais 3 requetes..: Code :
Whats wrong with me ?
|
|||
|
|
00
|
|
|
#6 |
![]() ![]() |
As-tu remarqué que j'ai remplacé ta variable $session, qui prêtait à confusion, par la variable $prenom dans la requête ?
Tu n'as pas besoin des deux premières requêtes, seulement de la troisième. Commence par tester la requête sur phpMyAdmin ou tout autre outil que tu utilises pour gérer la BDD en remplaçant la variable $prenom par un prénom existant dans la table. Bref, il faut quand même faire un petit effort d'adaptation de la solution donnée. tmp et c sont tout simplement d'autres alias pour la table classe et la sous-requête.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise la suite Linux Mageïa ! |
|
00
|
|
|
#7 | ||||
|
Invité de passage
![]() Inscription : décembre 2012 Messages : 38 ![]() |
Citation:
APres qd je test ta requete dans mysql : Code :
Citation:
Je fais des effort je te le garanti, jai pas décollé mon siege depuis ce matin 8h . Je me permet de te poser la question, n'es ce pas plus simple/possible de soustraire toute les notte des eleves à celle de référence et de les trier desc , cela donerai (il me semble) une liste des éleve ayant le moins d'écart, ensuite calculé le % via php ? D'une maniere générale je me questionnais sur la meilleure méthode en terme de performance. Faut il mieux calculer les pourcentage via mysql ou via php ?! Apres bien sur je ne critique pas ta technique, jaimerais déjà réussir à la faire fonctionner .. Jess |
||||
|
|
00
|
|
|
#8 |
![]() ![]() |
Et bien je découvre encore une lacune du mauvais MySQL : il ne connait pas FULL OUTER JOIN !
Essaie avec CROSS JOIN.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise la suite Linux Mageïa ! |
|
00
|
|
|
#9 |
|
Invité de passage
![]() Inscription : décembre 2012 Messages : 38 ![]() |
AH ca marche déjà mieux
pour toute les notes inférieur a celle comparé, celle supérieur donne des pourcentage supérieur, ex si la note de reference est 10 il va donner 150% à celui qui aura 15. Et comme jaimerai les trier du plus petit écart au plus grand ca marche moyen, que pense tu de mon idée de soustraire les notes et de calculer le % via php, cest mieux niveau performance ou pas du tout ?! |
|
|
00
|
|
|
#10 | |
|
Invité de passage
![]() Inscription : décembre 2012 Messages : 38 ![]() |
Citation:
|
|
|
|
00
|
|
|
#11 | ||
![]() ![]() |
Il vaut mieux calculer directement en SQL.
Code :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise la suite Linux Mageïa ! |
||
|
00
|
|
|
#12 | ||
|
Invité de passage
![]() Inscription : décembre 2012 Messages : 38 ![]() |
TU as une erreure à la ligne 3 !
On va y arriver lol , de mon coté j'arrive à bien les trier grace à Code :
|
||
|
|
00
|
|
|
#13 |
![]() ![]() |
ORDER BY ecart_pourcent puisque j'ai changé d'alias.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise la suite Linux Mageïa ! |
|
00
|
|
|
#14 | ||||
|
Invité de passage
![]() Inscription : décembre 2012 Messages : 38 ![]() |
Code :
Code :
pour cette meme note reference , 34 donnerai lécart 100-34=66 soit 100-66=34% ! Jai jamais fait de math dans ma vie mais ca alair detre logike ?! Si tu veux toi ossi capituler je comprendrai .. |
||||
|
|
00
|
|
|
#15 |
|
Invité de passage
![]() Inscription : décembre 2012 Messages : 38 ![]() |
Pour illustrer mon mernier message, si on prend la note référence 20.
Pierre à 10 et nico à 30 . Avec le calcul des % de base, nico serait à 30/20*100 soit 66% et pierre à 10/20$100 soit 50% et ils ont pourtant le meme écart, si je déraille dis le moi mais je crois pas..!? |
|
|
00
|
|
|
#16 | ||
![]() ![]() |
Si je reprends mon calcul que tu as corrigé en ajoutant la parenthèse manquante :
Code :
(100 * ABS(c.note - tmp.note) )/ tmp.note Soit 10 l'autre note à évaluer, c'est à dire c.note. c.note - tmp.note = 10 - 20 = -10 ABS(c.note - tmp.note) = valeur absolue de -10 = 10 (100 * ABS(c.note - tmp.note) ) = 1000 (100 * ABS(c.note - tmp.note) )/ tmp.note = 1000 / 20 = 50%=> La note à évaluer est à 50% de la note de référence. Si la note à évaluer est 30, l'écart sera le même (30 - 20 = 10) et donc le pourcentage de distance aussi. Prenons maintenant une note à évaluer de 18. c.note - tmp.note = 18 - 20 = -2 ABS(c.note - tmp.note) = valeur absolue de -2 = 2 (100 * ABS(c.note - tmp.note) ) = 200 (100 * ABS(c.note - tmp.note) )/ tmp.note = 200 / 20 = 10%=> La note à évaluer est à 10% de la note de référence. et 18 est bel et bien plus près de 20 (distance moins grande) que 10. Mais, si j'ai bien compris, tu veux le pourcentage de la note à évaluer par rapport à la note de référence ? Code :
100 * (1 - (ABS(c.note - tmp.note) / tmp.note)) 100 * (1 - (ABS(18 - 20) / 20)) = 100 * (1 - (ABS(-2) / 20)) = 100 * (1 - (2 / 20)) = 100 * (1 - 0,1) = 100 * (0,9) = 90% La requête devrait donc être celle-ci si tu veux trier à partir du plus proche : Code :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise la suite Linux Mageïa ! |
||
|
10
|
|
|
#17 |
|
Invité de passage
![]() Inscription : décembre 2012 Messages : 38 ![]() |
Boudiou, j'aurai pas trouvée toute seule !! Tout ca a lair de fonctionner comme il faut..Je vais aprofondir pour essayer de mieux comprendre et faire marcher tout ca concretement maintenant mais je t'envoie déjà un enorme merci
Je te souhaite une tres bonne soirée,je vais dormir plus tranquile que la nuit précédente bize Jess |
|
|
00
|
|
|
#18 | ||
|
Invité de passage
![]() Inscription : décembre 2012 Messages : 38 ![]() |
De bon matin
Je crois bien avoir crier victoire un peu trop vite Dans ta formule 100 * (1 - (ABS(18 - 20) / 20)) ou 20 est la note de référence et 18 la note a tester, on se retrouve avec un nombre négatif lorsque le résultat de (x-x)/x) est supérieur à 1 . Deux Exemples : Paul à la note 9 et il lance sa recherche , jean à 18 et charles à 19 . 100 * (1 - (ABS(18 - 9) / 9)) 100 * (1 - (ABS(9) / 9)) 100 * (1 - (ABS(1)) 100 * (1 - 1) jean à 0% pour un écart de 9 100 * (1 - (ABS(19 - 9) / 9)) 100 * (1 - (ABS(10 / 9)) 100 * (1 - (ABS(1,11) 100 * (-0,11) Charles à -11% pour un ecart de 10 . quand lucie (qui a 19) fais sa recherche et tombe sur charles(qui a 9) , voila son résultat : 100 * (1 - (ABS(9 - 19) / 19)) 100 * (1 - (ABS(10 /19)) 100 * (1 - (ABS(0,52) 100 * (0,48) Lucie à 48% pour un ecart de 10 . Pour reformuler completement, admetons un point darivé P qui est a 100km du départ de la course. jaimerai que Jean J qui a déja effectué 24km soit donc à 100-24 = 76% du point darivé , il lui reste 76% du trajet a parcourir. Lucie qui elle n'à pas vu l'arrivée et à dépassé P de 34km se retrouve a 134-100=34%, il lui reste 34% du trajet a parcourir . Je ne sais pas si cest plus simple mais j'arrive a sortir le plus petit ecart au plus grand afin que lecart soit toujours positif comme ca : Code :
Jess |
||
|
|
00
|
|
|
#19 | ||
![]() ![]() |
Bon alors la formule serait plutôt celle-ci :
Code :
100 * (ABS(c.note - tmp.note) / tmp.note) 100 * (ABS(18 - 9) / 9) = 100 * (ABS(9) / 9) = 100 * (1) = 100 => La note 18 est bien à 100% de la note de référence 9. La requête, avec exclusion de Paul du résultat : Code :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise la suite Linux Mageïa ! |
||
|
00
|
|
|
#20 | ||
|
Invité de passage
![]() Inscription : décembre 2012 Messages : 38 ![]() |
non mais 9 peut pas etre a 100% de 18 ou inversement !
9 est a 100% de 9 et 18 est a 100% de 18, cest en kelke sorte ce que tu avais fait avant qui reste logique mais ca ne fonctionne pas au vu des exemple que j'ai écrit précédemment , il faudrait retoucher ta formule pour qu'elle ne donne pas des pourcentage négatif ; Sinon avec : Code :
prenom ecart jean 3 yves 7 george 44 lucie 75 nico 130 ETC.. Quelle ke soit la note de ref , on sait maintenant que lécart en % = 100-3=97% 100-7=93% 100-44=56% Sauf que je crois qu'on rencontre le meme PB qu'avec ta méthode dés que l'écart dépasse 100 ca donne 100-130=-130% ca enleve qd meme un probleme , les meme ecart ont maintenant tous le meme pourcentage..Une idée?! |
||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com