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

Requêtes MySQL Discussion :

Requête complexe => besoin d'aide


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de bond70
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 300
    Par défaut Requête complexe => besoin d'aide
    Salut,

    Voilà je suis en train de faire un site de statistiques sur les formations antérieur suivi par les étudiants de notre département.

    Voici de que j'aimerais à la fin =>

    Exemple de résultat :

    Semestre1:

    BTS = 60 personnes
    DUT = 30 personnes
    CPGE = 10 personnes

    Semestre2:

    BTS = 55 personnes
    DUT = 35 personnes
    CPGE = 11 personnes
    et ainsi de suite.

    J'ai deux tables : formationanterieur et etudiant dont voici le contenu en screen ci-dessous

    Pour l'instant j'aimerais juste selectionner les etudiants du semestre 1 (e.semestreId=1)
    qui ont suivi un BTS (libelleDiplomeEtablissementFormationAnterieur LIKE '%BTS%')

    => Le problème est que dans ma table formationanterieur je possède leur premiere annee de BTS ainsi que leur deuxieme annee. Donc pour ne pas fausser les statistiques, il me faudrait juste la dernière année du diplome pour ne pas avoir deux BTS pour un même étudiant
    (anneeDiplomeEtudiantFormationAnterieur = (
    SELECT MAX( anneeDiplomeEtudiantFormationAnterieur ) FROM formationanterieur )
    .

    J'ai donc réalisé cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT count(f.libelleDiplomeEtablissementFormationAnterieur) 
    FROM formationanterieur f 
    LEFT JOIN etudiant e 
    ON f.nomEtudiantFormationAnterieur=e.nomEtudiant 
    AND f.prenomEtudiantFormationAnterieur=e.prenomEtudiant 
    AND e.semestreId=1
    WHERE anneeDiplomeEtudiantFormationAnterieur = ( 
    SELECT MAX( anneeDiplomeEtudiantFormationAnterieur ) 
    FROM formationanterieur ) 
    AND f.libelleDiplomeEtablissementFormationAnterieur 
    LIKE '%BTS%'";
    Le problème c'est que çà me retourne "1" alors que dans ma table j'ai deux étudiants possédant un BTS !

    Je crois que la sélection de l'année max pour chaque personne est erronée. Il ne prends que l'année max dans toute la table et non pas pour chaque étudiant possédant un BTS...

    Merci de votre aide !

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 161
    Par défaut
    Je pense que tu n'es pas dans la bonne session.
    Ce n'est pas un problème de php mais de sql.

    Ensuite pourquoi tu ne fais pas une recherche par rapport à la table
    typeEtablissementFormationAnterieur, tu n'aura plus besoin de mettre de like.


    Ensuite pour résoudre ton problème il suffit que tu sélectionne par type donc BTS tu les groupes par étudiants tout en faisant un distinct ce qui te supprimera les doublons.

    Après ta table n'est pas en troisième forme normal.

    Dans ta table formation il serait plus judicieux de supprimer le nom et le prénom en les remplaçant par leur ID.
    Qui serait une clé étrangère à ta table étudiants.

    bye

  3. #3
    Membre éclairé Avatar de bond70
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 300
    Par défaut
    Salut,

    Ensuite pourquoi tu ne fais pas une recherche par rapport à la table
    typeEtablissementFormationAnterieur, tu n'aura plus besoin de mettre de like.
    Parce-que dans le cas d'un lycée, celui-ci peut décerner un BTS et aussi un diplôme préparatoire (CPGE).

    Ensuite pour résoudre ton problème il suffit que tu sélectionne par type donc BTS tu les groupes par étudiants tout en faisant un distinct ce qui te supprimera les doublons.
    On peut faire comme çà non :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT DISTINCT count(f.libelleDiplomeEtablissementFormationAnterieur) 
    FROM formationanterieur f 
    LEFT JOIN etudiant e 
    ON f.nomEtudiantFormationAnterieur=e.nomEtudiant 
    AND f.prenomEtudiantFormationAnterieur=e.prenomEtudiant 
    AND e.semestreId=1
    WHERE anneeDiplomeEtudiantFormationAnterieur = ( 
    SELECT MAX( anneeDiplomeEtudiantFormationAnterieur ) 
    FROM formationanterieur ) 
    AND f.libelleDiplomeEtablissementFormationAnterieur 
    LIKE '%BTS%'";
    Après ta table n'est pas en troisième forme normal.
    C'est à dire ?

    Dans ta table formation il serait plus judicieux de supprimer le nom et le prénom en les remplaçant par leur ID.
    Qui serait une clé étrangère à ta table étudiants.
    Je ferais sans doute cela par la suite

    Merci de votre AIDE !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 161
    Par défaut
    Parce-que dans le cas d'un lycée, celui-ci peut décerner un BTS et aussi un diplôme préparatoire (CPGE).
    C'est que ta base est mal conçu, certaine amélioration sont à faire.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT DISTINCT count(f.libelleDiplomeEtablissementFormationAnterieur) 
    FROM formationanterieur f 
    LEFT JOIN etudiant e 
    ON f.nomEtudiantFormationAnterieur=e.nomEtudiant 
    AND f.prenomEtudiantFormationAnterieur=e.prenomEtudiant 
    AND e.semestreId=1
    WHERE anneeDiplomeEtudiantFormationAnterieur = ( 
    SELECT MAX( anneeDiplomeEtudiantFormationAnterieur ) 
    FROM formationanterieur ) 
    AND f.libelleDiplomeEtablissementFormationAnterieur 
    LIKE '%BTS%'";
    Je n'ai jamais dis qu'il fallais faire comme sa.
    Le distinct est mal placé.

    Pour créer des commandes je sépare toujours ce que je fais.
    Dans ton cas :
    Je sélectionnerai d'abord les étudiants qui on un bts.
    Je les grouperai par étudiants.
    Ensuite je fais une relation avec l'autre table.

    En décomposant ta réflexion et donc tes commandes tu trouve le bon résultat.

    C'est à dire ?
    Sur les tables simple il est facile de voir si c'est en troisième forme normal.
    Sur des tables plus compliqué il faut transformer ce code en algorithmique et faire des tests (assez long).

    1FN - première forme normale :
    Relation dont tous les attributs :

    * contiennent une valeur atomique (les valeurs ne peuvent pas être divisées en plusieurs sous-valeurs dépendant également individuellement de la clé primaire)
    * contiennent des valeurs non répétitives (le cas contraire consiste à mettre une liste dans un seul attribut).
    * sont constants dans le temps (utiliser par exemple la date de naissance plutôt que l'âge).

    Le non respect de deux premières conditions de la 1FN rend la recherche parmi les données plus lente parce qu'il faut analyser le contenu des attributs. La troisième condition quant à elle évite qu'on doive régulièrement mettre à jour les données.

    2FN - deuxième forme normale
    Respecte la deuxième forme normale, la relation respectant la première forme normale et dont :

    * Tout attribut ne composant pas un identifiant dépend d'un identifiant.

    Le non respect de la 2FN entraine une redondance des données qui encombrent alors inutilement la mémoire et l'espace disque.

    3FN - troisième forme normale
    Respecte la troisième forme normale, la relation respectant la seconde forme normale et dont :

    * Tout attribut ne composant pas un identifiant dépend directement d'un identifiant.

    Le non respect de la 3FN peut également entrainer une redondance des données.

  5. #5
    Membre éclairé Avatar de bond70
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 300
    Par défaut
    1)Je sélectionnerai d'abord les étudiants qui on un bts.
    2)Je les grouperai par étudiants.
    3)Ensuite je fais une relation avec l'autre table.
    J'ai pensé à çà :

    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE f.libelleDiplomeEtablissementFormationAnterieur 
    LIKE '%BTS%'
    2)
    3)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    LEFT JOIN etudiant e 
    ON f.nomEtudiantFormationAnterieur=e.nomEtudiant 
    AND f.prenomEtudiantFormationAnterieur=e.prenomEtudiant 
    AND e.semestreId=1
    Je ne sais pas si c'est juste...

    Merci !

Discussions similaires

  1. Besoin d'aide pour une requête assez complexe
    Par NaoufalB dans le forum SQL
    Réponses: 4
    Dernier message: 10/06/2015, 18h25
  2. [MSSQL2005] Besoin d'aide pour une requête complexe
    Par Vonotar dans le forum Langage SQL
    Réponses: 4
    Dernier message: 17/01/2007, 16h47
  3. Requête de suppression de doublons : besoin d'aide
    Par biocorp dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/01/2004, 17h04
  4. Réponses: 5
    Dernier message: 04/08/2003, 21h50

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