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 :

Problème jointure externe


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 13
    Points : 11
    Points
    11
    Par défaut Problème jointure externe
    Bonjour à tous,

    Cela fait maintenant plusieurs jours que je cherche une solution à mon problème mais en vain. J'en appelle donc à votre aide ...

    Alors voilà, j'ai une base de donnée avec 3 tables (membre, stage et stagiaire).

    Voici les champs de chacun:

    membre(id, nom)

    stage(id, id_membre, date, formation)

    stagiaire(id, id_stage, nom).

    Il s'agit d'un système de formation avec une certain nombre d'organisme (membre) qui propose des formations en ligne (stages) sur lesquels des candidats (stagiaires) peuvent s'y inscrire.

    J’essaie de récupérer la somme des stagiaires et des stages sur une plage de date données pour tous les membres. Mais la difficulté ici est que j'aimerais également récupérer les données de membre qui n'ont pas de stages en ligne ainsi que les stages sur lesquels il n'y a aucun candidat d'inscrit. Toutes ces données seront affichées par membre. Je me suis donc tournée sur une jointure externe du type:

    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
     
    SELECT
      SUM(stagiaire.id != 0) AS nb,
      SUM(stage.id != 0) AS stage_ligne,
      membre.nom
     
    FROM membre
     
    LEFT JOIN stage
    ON
      stage.id_membre = membre.id
     
    LEFT JOIN stagiaire
    ON
      stagiaire.id_stage = stage.id
     
    WHERE
      stage.date1 BETWEEN '$DateDebut' AND '$DateFin'
     
    GROUP BY
      membre.id
    Le soucis est que cette requête tourne indéfiniment sans donner aucun résultat ...

    Auriez vous une idée de comment je peux faire pour y arriver ?

    Merci pour votre aide précieuse !

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 240
    Points : 12 872
    Points
    12 872
    Par défaut
    Bonjour,
    Je ne saurais pas dire pourquoi la requête prends du temps, mais je vois tout de même deux erreurs:
    Code SQL : 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
     
     
    SELECT
      SUM(stagiaire.id != 0) AS nb,
      SUM(stage.id != 0) AS stage_ligne,
      membre.nom
     
    FROM membre
     
    LEFT JOIN stage
    ON
      stage.id_membre = membre.id
      and   stage.date1 BETWEEN '$DateDebut' AND '$DateFin'
     
    LEFT JOIN stagiaire
    ON
      stagiaire.id_stage = stage.id
     
     
    GROUP BY
      membre.nom
    Il faut mettre la restriction sur la table Stage dans la jointure, sinon on se retrouve de fait avec une jointure interne.

    De plus, le GROUP BY doit se faire sur les colonnes du résultat qui ne font pas l'objet dune aggrégation (donc ici membre.nom).

    Tatayo.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Merci pour la réponse Tatayo.

    J'ai repris ton code proposé mais la requête ne se passe pas mieux (elle ne s'arrête toujours pas ...).

    Quelqu'un aurait-il une explication ??

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    N'y aurait-il pas un verrou sur l'une des tables ? (une transaction non terminée qui traine...)

    au passage, je pense qu'il y a une autre erreur dans la requete, et qu'il vous faudrait plutot ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT
      COUNT(stagiaire.id ) AS nb,
      COUNT(DISTINCT stage.id ) AS stage_ligne,
    ...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Merci pour ta réponse aieeeuuuuu.

    Je viens de corrigé la requête comme tu me l'as conseillé mais ça ne fonctionne toujours pas ... J'ai vérifié ma base, et il n'y a pas de transaction non terminée qui traine.

    Là je sèche ...

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    quelle est la volumétrie ?

    Postez également la structure de vos tables et vos index

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    La volumétrie est faible (une dixaine d'enregistrements pour les membres, une centaine pour les stages et stagiaires).

    Voici la structure des tables:
    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
     
    CREATE TABLE IF NOT EXISTS `membre` (
      `id` smallint(4) NOT NULL AUTO_INCREMENT,
      `login` text NOT NULL,
      `pass_md5` text NOT NULL,
      `nom` text NOT NULL,
      `adresse` text NOT NULL,
      `email` text NOT NULL,
      PRIMARY KEY (`id`)
    )
     
    CREATE TABLE IF NOT EXISTS `stage` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `id_membre` mediumint(9) NOT NULL,
      `date1` date NOT NULL,
       PRIMARY KEY (`id`)
    ) 
     
    CREATE TABLE IF NOT EXISTS `stagiaire` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `id_stage` int(11) NOT NULL,
      `nom` text NOT NULL,
      PRIMARY KEY (`id`)
    )
    Merci pour votre aide !!!

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 240
    Points : 12 872
    Points
    12 872
    Par défaut
    Je dirai qu'il manque un index sur les clé étrangères (qui manquent aussi !):
    un sur IdMembre dans la table stage
    un sur IdStage dans la table Stagiaire

    Tatayo.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Merci Tatayo.

    N'y a t'il pas de solution SQL sans avoir à modifier la base ?

  10. #10
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    par ailleurs, id_membre dans la table stage est en mediumint, alors que c'est un smallint dans la table membre...

Discussions similaires

  1. Problème jointure externe (LEFT JOIN et pas (+))
    Par tatayoyo dans le forum ODI (ex-Sunopsis)
    Réponses: 1
    Dernier message: 12/05/2011, 13h15
  2. [VxiR2] Problème "jointure externe ambigüe"
    Par juju05 dans le forum Deski
    Réponses: 4
    Dernier message: 02/08/2010, 11h20
  3. Problèmes jointures externes
    Par B&B dans le forum SQL
    Réponses: 4
    Dernier message: 30/09/2008, 12h24
  4. Réponses: 3
    Dernier message: 29/10/2007, 13h04
  5. Problème jointures externes BO
    Par leelee dans le forum Designer
    Réponses: 1
    Dernier message: 17/03/2007, 09h29

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