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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 814
    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, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 averti
    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
    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
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 814
    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, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 averti
    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
    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
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 814
    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, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

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