IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

pourcentage plus proche de la note de nicolas


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 45
    Points : 13
    Points
    13
    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
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 45
    Points : 13
    Points
    13
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 45
    Points : 13
    Points
    13
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 45
    Points : 13
    Points
    13
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 45
    Points : 13
    Points
    13
    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
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 45
    Points : 13
    Points
    13
    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
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Il vaut mieux calculer directement en SQL.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 45
    Points : 13
    Points
    13
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    ORDER BY ecart_pourcent puisque j'ai changé d'alias.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 45
    Points : 13
    Points
    13
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 45
    Points : 13
    Points
    13
    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
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Si je reprends mon calcul que tu as corrigé en ajoutant la parenthèse manquante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 45
    Points : 13
    Points
    13
    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
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 45
    Points : 13
    Points
    13
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Bon alors la formule serait plutôt celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 45
    Points : 13
    Points
    13
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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?!

Discussions similaires

  1. Arrondi au multiple le plus proche ...
    Par Marco85 dans le forum Algorithmes et structures de données
    Réponses: 14
    Dernier message: 21/07/2009, 13h56
  2. [Ingres] Est-il plus proche de Transac ou d'Oracle ?
    Par tomsoyer dans le forum Autres SGBD
    Réponses: 1
    Dernier message: 23/03/2006, 13h31
  3. [C#][VS2003] Arrondir un float à l'inférieur le plus proche
    Par gregos dans le forum Windows Forms
    Réponses: 2
    Dernier message: 16/11/2005, 12h14
  4. Recherche de point le plus proche [façon optimal]
    Par norwy dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 21/10/2005, 17h15
  5. Récupurer via une requête SQL la valeur la plus proche
    Par yoda_style dans le forum Langage SQL
    Réponses: 9
    Dernier message: 27/04/2004, 13h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo