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

Langage SQL Discussion :

REQUETE multi jointure


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 12
    Points : 4
    Points
    4
    Par défaut REQUETE multi jointure
    Bonjour

    J’ai un souci de lenteur avec une requête avec plusieurs jointures
    en effet, avec la première jointure ca va, mais dès que j’en mets une autre, c’est lent.

    J’aimerai savoir pour chaque ELEVE :
    en ANGLAIS : leur 1er cours , leur dernier cours
    en MATHS : leur 1er cours , leur dernier cours
    en PHYSIQUE : leur 1er cours , leur dernier cours

    Je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT E.eleve_id
     
    , MIN(Ca. DATE_COURS) as ‘1er Anglais’
    , MAX(Ca. DATE_COURS) as ‘derner Anglais’
    , MIN(Cm. DATE_COURS) as ‘1er Maths’
    , MAX(Cm. DATE_COURS) as ‘derner Maths’
    , MIN(Cp. DATE_COURS) as ‘1er Physique
    , MAX(Cp. DATE_COURS) as ‘derner Physique
    FROM eleves E
    –(ex 1 = anglais, 2 = maths…)
    LEFT JOIN cours Ca ON Ca.eleve_id = E.eleve_id AND Ca. GENRE_COURS   = 1 
    LEFT JOIN cours Cm ON Cm.eleve_id = E.eleve_id AND Cm. GENRE_COURS   = 2
    LEFT JOIN cours Cp ON Cp.eleve_id = E.eleve_id AND Cp. GENRE_COURS   = 3
    GROUP BY E.eleve_id

    Merci

  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
    Si GENRE_COURS est une clé étrangère faisant référence à une autre table qui contiendrait par exemple une colonne libelle_cours, tu peux faire une seule jointure sur la table cours :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT e.eleve_id, gc.libelle_cours, 
        MIN(ca.DATE_COURS) AS premier,
        MAX(ca.DATE_COURS) AS dernier
    FROM eleves E
    LEFT OUTER JOIN cours ca ON ca.eleve_id = E.eleve_id
        LEFT OUTER JOIN genre_cours gc ON gc.genre_cours_id = ca.genre_cours -- A adapter ici aux vraies tables
    WHERE ca.GENRE_COURS BETWEEN 1 AND 3 -- Si la liste des id n'est pas continue, utiliser IN
    GROUP BY e.eleve_id, gc.libelle_cours
    Et bien sûr il faut que toutes les colonnes figurant dans les conditions de jointures soient indexées pour avoir de bonnes performances.
    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
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 12
    Points : 4
    Points
    4
    Par défaut REQUETE multi jointure
    super mais j'ai oublié une précision

    je ne souhaite m'occuper que des élèves présents en 2010

    ex : MARC
    1er ANGLAIS = '01/01/2009'
    dernier ANGLAIS = '01/10/2009'
    1er MATHS = '01/05/2009'
    Dernier MATHS = '01/06/2010'

    ex : PAUL
    1er ANGLAIS = '01/01/2009'
    dernier ANGLAIS = '01/10/2009'
    1er MATHS = '01/05/2009'
    Dernier MATHS = '01/06/2009'

    ici je dois avoir MARC mais pas PAUL (car il n'est pas venu en 2010)

    merci en tout ca pour tes réponse

  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
    Ben tu ajoutes une condition de restriction sur les dates dans le WHERE !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT e.eleve_id, gc.libelle_cours, 
        MIN(ca.DATE_COURS) AS premier,
        MAX(ca.DATE_COURS) AS dernier
    FROM eleves E
    LEFT OUTER JOIN cours ca ON ca.eleve_id = E.eleve_id
        LEFT OUTER JOIN genre_cours gc ON gc.genre_cours_id = ca.genre_cours -- A adapter ici aux vraies tables
    WHERE ca.GENRE_COURS BETWEEN 1 AND 3 -- Si la liste des id n'est pas continue, utiliser IN
        AND ca.DATE_COURS BETWEEN '2010-01-01' AND '2010-12-31'
    GROUP BY e.eleve_id, gc.libelle_cours
    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 expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    bonjour

    je ne souhaite m'occuper que des élèves présents en 2010

    dans ce cas une petite clause HAVING, genre (en suivant le modele de cinephil)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT e.eleve_id, gc.libelle_cours, 
        MIN(ca.DATE_COURS) AS premier,
        MAX(ca.DATE_COURS) AS dernier
    FROM eleves E
    LEFT OUTER JOIN cours ca ON ca.eleve_id = E.eleve_id
        LEFT OUTER JOIN genre_cours gc ON gc.genre_cours_id = ca.genre_cours -- A adapter ici aux vraies tables
    WHERE ca.GENRE_COURS BETWEEN 1 AND 3 -- Si la liste des id n'est pas continue, utiliser IN
        AND ca.DATE_COURS BETWEEN '2010-01-01' AND '2010-12-31'
    GROUP BY e.eleve_id, gc.libelle_cours
     
     
    HAVING EXTRACT(YEAR OF MIN(ca.DATE_COURS) = 2010) OR 
               EXTRACT(YEAR OF MAX(ca.DATE_COURS) = 2010)  -- pour prevoir les deux cas (le max en 2011)
    Merci d'ajouter un sur les tags qui vous ont aidé

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    hé non car dans ce cas, je n'aurais pas le 1er cours mais uniquement le 1er cours DE l'année.

    or je cherche son 1er cours

    ex : MARC
    1er ANGLAIS = '01/01/2009'
    dernier ANGLAIS = '01/10/2009'
    1er MATHS = '01/05/2009'
    Dernier MATHS = '01/06/2010'

    merci

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Je reformule :

    Pour les ELEVES présents en 2010

    Quel est leur 1er et Dernier cours d’ANGLAIS
    Quel est leur 1er et Dernier cours de MATHS
    Quel est leur 1er et Dernier cours de PHYSIQUE

    Peu importe l’année de ces cours.

    ex : MARC
    1er ANGLAIS = '01/01/2009'
    dernier ANGLAIS = '01/10/2009'
    1er MATHS = '01/05/2009'
    Dernier MATHS = '01/06/2010'

    ex : PAUL
    1er ANGLAIS = '01/01/2009'
    dernier ANGLAIS = '01/10/2009'
    1er MATHS = '01/05/2009'
    Dernier MATHS = '01/06/2009'

    ici je dois avoir MARC mais pas PAUL (car il n'est pas venu en 2010)

    pour MARC, il est bien venu en 2010 et son 1er cours ANGLAIS était en 2009

    merci

  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
    OK alors il faut décomposer le problème...

    Si je comprends bien, c'est la date du cours qui détermine si un élève est présent ou non une année, du moment qu'il a participé à au moins un cours au cours de l'année ?

    1) Quels sont les élèves présents en 2010 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT eleve_id
    FROM cours
    WHERE DATE_COURS BETWEEN '2010-01-01' AND '2010-12-31'
    2) Pour ces élèves, quel est le premier et le dernier cours auquel ils ont participé dans chaque matière choisie ?
    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
    SELECT e.eleve_id, gc.libelle_cours, 
        MIN(ca.DATE_COURS) AS premier,
        MAX(ca.DATE_COURS) AS dernier
    FROM eleves E
    INNER JOIN
    (
      SELECT DISTINCT eleve_id
      FROM cours
      WHERE DATE_COURS BETWEEN '2010-01-01' AND '2010-12-31'
    ) tmp ON tmp.eleve_id = E.eleve_id
    LEFT OUTER JOIN cours ca ON ca.eleve_id = E.eleve_id
        LEFT OUTER JOIN genre_cours gc ON gc.genre_cours_id = ca.genre_cours -- A adapter ici aux vraies tables
    WHERE ca.GENRE_COURS BETWEEN 1 AND 3 -- Si la liste des id n'est pas continue, utiliser IN
    GROUP BY e.eleve_id, gc.libelle_cours
    ORDER BY e.eleve_id, gc.libelle_cours
    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
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Milles merci

    bonne soirée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requete de recupération avec multi-jointures
    Par y0ussef dans le forum Doctrine2
    Réponses: 5
    Dernier message: 29/05/2012, 10h18
  2. Requete Multi jointure lourde, besoin d'optimisation
    Par Kijer dans le forum Requêtes
    Réponses: 13
    Dernier message: 22/10/2007, 16h43
  3. Problème Requete Multi Jointure + Like
    Par thefutureisnow dans le forum Langage SQL
    Réponses: 27
    Dernier message: 06/01/2006, 15h50
  4. Problème Requete Multi Jointure + Like
    Par thefutureisnow dans le forum Requêtes
    Réponses: 3
    Dernier message: 02/01/2006, 19h39
  5. Problème de requete multis-selections
    Par tripper.dim dans le forum SQL
    Réponses: 9
    Dernier message: 03/09/2003, 13h08

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