Publicité
+ Répondre à la discussion
Page 1 sur 2 12 DernièreDernière
Affichage des résultats 1 à 20 sur 35
  1. #1
    Invité régulier
    Femme Profil pro
    Inscrit en
    décembre 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : décembre 2012
    Messages : 45
    Points : 6
    Points
    6

    Par défaut pourcentage plus proche de la note de nicolas

    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

  2. #2
    Modérateur
    Avatar de CinePhil
    Homme Profil pro Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 819
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2006
    Messages : 13 819
    Points : 24 808
    Points
    24 808

    Par défaut

    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 !

  3. #3
    Invité régulier
    Femme Profil pro
    Inscrit en
    décembre 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : décembre 2012
    Messages : 45
    Points : 6
    Points
    6

    Par défaut

    Merci pour la réponse,

    "Commence par faire une requête qui cherche la plus grande note de l'élève choisi pour référence."
    Je n'ai pas acces aux différentes note je n'ai q'une note moyenne générale.

    "Fais une autre requête qui donne la liste de toutes les notes des élèves sauf celui en référence."
    Ca j'arrive à le faire dans mon code php de cette manière :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    $req2 = mysql_query("SELECT ELEVES FROM classe WHERE ELEVES <> '$session'" );
     
    	while($reqtemp=mysql_fetch_array($req2))  {
     
    	echo "<pre>"; 
    	echo  $reqtemp['ELEVES'];  
    	echo "<pre>";
    ( La jai séléctionner uniquement tous les noms des éleves mais je pense que cest le meme principe pour les notes )

    Dans la requête finale, fais un produit cartésien (FULL OUTER JOIN) entre les deux requêtes
    La on y est , cest du chinois pour moi

  4. #4
    Modérateur
    Avatar de CinePhil
    Homme Profil pro Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 819
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2006
    Messages : 13 819
    Points : 24 808
    Points
    24 808

    Par défaut

    Tu sélectionnes une colonne ELEVES (qui devrait être nommée au singulier ) alors que tu as dit dans ton premier message ceci :
    jai 2 colonne dans ma base. prenom et note.
    Maintenant que tu parles de moyenne, je crois comprendre que cette colonne "note" est en fait une moyenne et non pas une note ?

    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 Envoyé par CinéPhil
    Commence par faire une requête qui cherche la plus grande note de l'élève choisi pour référence.
    Donc en fait, si j'ai bien compris, tu n'as qu'une seule note (moyenne en réalité) par élève ?
    Code :
    1
    2
    3
    SELECT note
    FROM classe
    WHERE prenom = '$prenom'
    Fais une autre requête qui donne la liste de toutes les notes des élèves sauf celui en référence.
    Code :
    1
    2
    3
    SELECT prenom, note
    FROM classe
    WHERE prenom <> '$prenom'
    Dans la requête finale, fais un produit cartésien (FULL OUTER JOIN) entre les deux requêtes
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT c.prenom, c.note,
    	tmp.note AS note_reference
    FROM classe c
    FULL OUTER JOIN
    (
    	SELECT note
    	FROM classe
    	WHERE prenom = '$prenom'
    ) tmp
    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.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT c.prenom, c.note,
    	tmp.note AS note_reference,
    	(100 * c.note) / tmp.note AS pourcentage
    FROM classe c
    FULL OUTER JOIN
    (
    	SELECT note
    	FROM classe
    	WHERE prenom = '$prenom'
    ) tmp
    ORDER BY pourcentage DESC
    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 !

  5. #5
    Invité régulier
    Femme Profil pro
    Inscrit en
    décembre 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : décembre 2012
    Messages : 45
    Points : 6
    Points
    6

    Par défaut

    Merci de maider cinephil

    Maintenant que tu parles de moyenne, je crois comprendre que cette colonne "note" est en fait une moyenne et non pas une note ?
    Exact, je me suis mal exprimée . Jai une colonne prénom pour les prénom et une colonne note(qui correspond effectivement à une moyenne) .

    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    		$req1 = mysql_query("SELECT note
    FROM classe
    WHERE prenom = '$prenom'
    "  );
     
    		$req2 = mysql_query("SELECT prenom, note
    FROM classe
    WHERE prenom <> '$prenom'"  );
     
    		$reqfinale = mysql_query("SELECT c.prenom, c.note,
    	tmp.note AS note_reference,
    	(100 * c.note) / tmp.note AS pourcentage
    FROM classe c
    FULL OUTER JOIN
    (
    	SELECT note
    	FROM classe
    	WHERE prenom = '$prenom'
    ) tmp
    ORDER BY pourcentage DESC"  );
     
     
    	while($reqtemp=mysql_fetch_array($reqfinale))  {
     
    	echo "<pre>"; 
    	echo  $reqtemp['prenom'];  
    	echo "<pre>";
     
    	}

    Whats wrong with me ?

  6. #6
    Modérateur
    Avatar de CinePhil
    Homme Profil pro Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 819
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2006
    Messages : 13 819
    Points : 24 808
    Points
    24 808

    Par défaut

    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 !

  7. #7
    Invité régulier
    Femme Profil pro
    Inscrit en
    décembre 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : décembre 2012
    Messages : 45
    Points : 6
    Points
    6

    Par défaut

    As-tu remarqué que j'ai remplacé ta variable $session, qui prêtait à confusion, par la variable $prenom dans la requête ?
    Oui javais remarqué et dans ma requete php je l'ai bien remplacé par ma variable session qui correspond au prenom de l'éleve qui fait la recherche;
    APres qd je test ta requete dans mysql :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT c.prenom, c.note,
    	tmp.note AS note_reference,
    	(100 * c.note) / tmp.note AS pourcentage
    FROM classe c
    FULL OUTER JOIN
    (
    	SELECT note
    	FROM classe
    	WHERE prenom = 'paul'
    ) tmp
    ORDER BY pourcentage DESC
    Il m'indique cette erreur :
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FULL OUTER JOIN ( SELECT note FROM classe WHERE prenom = 'paul' ) tmp ORDER B' at line 5
    Es tu sur que tu n'à pas homis quelque chose ?
    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

  8. #8
    Modérateur
    Avatar de CinePhil
    Homme Profil pro Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 819
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2006
    Messages : 13 819
    Points : 24 808
    Points
    24 808

    Par défaut

    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 !

  9. #9
    Invité régulier
    Femme Profil pro
    Inscrit en
    décembre 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : décembre 2012
    Messages : 45
    Points : 6
    Points
    6

    Par défaut

    AH ca marche déjà mieux L'inconvénient cest que ca marche bien
    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 ?!

  10. #10
    Invité régulier
    Femme Profil pro
    Inscrit en
    décembre 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : décembre 2012
    Messages : 45
    Points : 6
    Points
    6

    Par défaut

    Citation Envoyé par jesspoub Voir le message
    AH ca marche déjà mieux L'inconvénient cest que ca marche bien
    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 ?!
    Je précise dans mon cas pour une note reference à 10 , les note 5 et 15 devraient indiqué le meme pourcentage, car ils ont la meme distance par rapport à 10 ..

  11. #11
    Modérateur
    Avatar de CinePhil
    Homme Profil pro Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 819
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2006
    Messages : 13 819
    Points : 24 808
    Points
    24 808

    Par défaut

    Il vaut mieux calculer directement en SQL.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT c.prenom, c.note,
    	tmp.note AS note_reference,
    	(100 * ABS(c.note - tmp.note) / tmp.note AS ecart_pourcent
    FROM classe c
    CROSS JOIN
    (
    	SELECT note
    	FROM classe
    	WHERE prenom = 'paul'
    ) tmp
    ORDER BY pourcentage
    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 !

  12. #12
    Invité régulier
    Femme Profil pro
    Inscrit en
    décembre 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : décembre 2012
    Messages : 45
    Points : 6
    Points
    6

    Par défaut

    TU as une erreure à la ligne 3 !
    On va y arriver lol , de mon coté j'arrive à bien les trier grace à
    Code :
    1
    2
    3
    4
     
     
    SELECT prenom
    FROM classe  ORDER BY ABS(100-note)");
    Ou 100 correspond à la note de l'éleve ; J'arive pas a le mettre en pourcentage via SQL , via php je saurai faire un truc du genre si x>y alor y/x*100 me donnerai le pourcentage, mais via SQL..

  13. #13
    Modérateur
    Avatar de CinePhil
    Homme Profil pro Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 819
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2006
    Messages : 13 819
    Points : 24 808
    Points
    24 808

    Par défaut

    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 !

  14. #14
    Invité régulier
    Femme Profil pro
    Inscrit en
    décembre 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : décembre 2012
    Messages : 45
    Points : 6
    Points
    6

    Par défaut

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT c.prenom, c.note,
    	tmp.note AS note_reference,
    	(100 * ABS(c.note - tmp.note) / tmp.note AS ecart_pourcent
    FROM classe c
    CROSS JOIN
    (
    	SELECT note
    	FROM classe
    	WHERE prenom = 'paul'
    ) tmp
    ORDER BY ecart_pourcent DESC
    renvoie une erreure ligne 3 que je crois avoir corigé en rajoutant une paranthese :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT c.prenom, c.note,
    	tmp.note AS note_reference,
    	(100 * ABS(c.note - tmp.note) )/ tmp.note AS ecart_pourcent
    FROM classe c
    CROSS JOIN
    (
    	SELECT note
    	FROM classe
    	WHERE prenom = 'paul'
    ) tmp
    ORDER BY ecart_pourcent DESC
    Mais cela renvoie le meme resultat que tout a l'heure avec des pourcentage positif ! Le pb cest que dans mon cas le pourcentage doit se calculer de cette maniere : Pour une note référence de 100, 95 et 105 ont tous deux un écart de 5, donc leur pourcentage de la totalité = à 100(la totalité)-5(lécart) =95% !
    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 .. Cest pas si simple en faite on dirait..

  15. #15
    Invité régulier
    Femme Profil pro
    Inscrit en
    décembre 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : décembre 2012
    Messages : 45
    Points : 6
    Points
    6

    Par défaut

    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..!?

  16. #16
    Modérateur
    Avatar de CinePhil
    Homme Profil pro Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 819
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2006
    Messages : 13 819
    Points : 24 808
    Points
    24 808

    Par défaut

    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 20 la note de référence, c'est à dire 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))
    Pour une note à évaluer de 18, nous aurons cette fois :
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT c.prenom, c.note,
    	tmp.note AS note_reference,
    	100 * (1 - (ABS(c.note - tmp.note) / tmp.note)) AS ecart_pourcent
    FROM classe c
    CROSS JOIN
    (
    	SELECT note
    	FROM classe
    	WHERE prenom = 'paul'
    ) tmp
    ORDER BY ecart_pourcent DESC
    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 !

  17. #17
    Invité régulier
    Femme Profil pro
    Inscrit en
    décembre 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : décembre 2012
    Messages : 45
    Points : 6
    Points
    6

    Par défaut

    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 et je vais maintenant essayer de comprendre pourkoi ca marche lol

    bize

    Jess

  18. #18
    Invité régulier
    Femme Profil pro
    Inscrit en
    décembre 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : décembre 2012
    Messages : 45
    Points : 6
    Points
    6

    Par défaut

    De bon matin mais cest qd meme passionant !
    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 :
    1
    2
    3
    4
    5
     
    SELECT *, ABS((SELECT note FROM classe WHERE prenom = 'paul') - note) AS ecart
    FROM classe
    WHERE prenom != 'paul'
    ORDER BY ecart
    Y manquerait plus que les pourcentage que j'arive pas a faire , que pense tu de cette méthode ?! , Je précise que dans ta formule je n'arivais pas à exclure paul de la recherche.

    Jess

  19. #19
    Modérateur
    Avatar de CinePhil
    Homme Profil pro Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 819
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2006
    Messages : 13 819
    Points : 24 808
    Points
    24 808

    Par défaut

    Bon alors la formule serait plutôt celle-ci :
    Code :
    100 * (ABS(c.note - tmp.note) / tmp.note)
    Soit une tmp.note (la référence) de 9 et une note de 18, on obtient :
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT c.prenom, c.note,
    	tmp.note AS note_reference,
    	100 * (ABS(c.note - tmp.note) / tmp.note) AS ecart_pourcent
    FROM classe c
    CROSS JOIN
    (
    	SELECT note
    	FROM classe
    	WHERE prenom = 'Paul'
    ) tmp
    WHERE c.prenom <> 'Paul' 
    ORDER BY ecart_pourcent DESC
    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 !

  20. #20
    Invité régulier
    Femme Profil pro
    Inscrit en
    décembre 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : décembre 2012
    Messages : 45
    Points : 6
    Points
    6

    Par défaut

    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 :
    1
    2
    3
    4
    5
     
    SELECT *, ABS((SELECT note FROM classe WHERE prenom = 'paul') - note) AS ecart
    FROM classe
    WHERE prenom != 'paul'
    ORDER BY ecart
    J'obtiens :

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •