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 :

Requete sql qui marche à moitié


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Décembre 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : Décembre 2010
    Messages : 27
    Points : 28
    Points
    28
    Par défaut Requete sql qui marche à moitié
    Bonjour à tout le monde,
    Ma requête sql marche à moitié :
    Je vous expliques :
    Bonjour, j'ai un petit problème de requete, Je vous explique :

    Je dispose de 3 tables :
    Une table FAMILLE(cdFam,nomFam,adFam,...)
    Une table STAGE(cdStage,dateStage,...)
    Une table PARTICIPATION_FAMILLE(cdFam,cdStage,nbStagiaires)

    Une famille peut participer à plusieurs stage et possède un nombre de stagiaire pour ceux ci

    Et je voudrais lister toutes les familles avec le nombre de stagiaires qu'elle prennent pour les stages numero 1 et numero 3

    Je fais donc la requete suivante avec 2 jointures externe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT f.cdFam AS codeFam,
    f.nomFam AS famille,
    f.adFam AS adresse,
    IFNULL(pfJ.nbStagiaire,'0') AS nbStagiaireJuillet,
    IFNULL(pfA.nbStagiaire,'0') AS nbStagiaireAout
    FROM famille f 
    LEFT JOIN participation_famille pfJ ON pfJ.cdFam=f.cdFam 
    LEFT JOIN participation_famille pfA ON pfA.cdFam=f.cdFam 
    WHERE 
    (pfJ.cdStage=1 OR pfJ.cdStage IS NULL)
    AND (pfA.cdStage=3 OR pfA.cdStage IS NULL)
    La requete m'affiche ceux qui participent au stage 1 et 2 et aussi les familles qui ne participent pas au stage mais bizarrement pas ceux qui ne participent qu'a un seul des deux stages !
    J'arrive pas à comprendre ?!

    Avez vous une idée ?
    Merci d'avance

  2. #2
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    salut,

    essaye de changer le and de ton where entre les 2 conditions qui doit être un or pour que ça renvoie l'un ou l'autre

  3. #3
    Nouveau membre du Club
    Inscrit en
    Décembre 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : Décembre 2010
    Messages : 27
    Points : 28
    Points
    28
    Par défaut
    Oui, ça donne le bon résultat mais la requête liste en double des familles
    Par exemple une famille qui participe au stage 1 et 3
    apparait 3 fois une fois pour le stage 1, un fois pour le stage 3 et une fois pour le stage 1 et 3

  4. #4
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    en supprimant les parties avec is null ça donne quoi?

    au fait pourquoi tu mets pas ces conditions chacune au niveau de tes jointures plutôt que dans le where?

  5. #5
    Nouveau membre du Club
    Inscrit en
    Décembre 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : Décembre 2010
    Messages : 27
    Points : 28
    Points
    28
    Par défaut
    la même chose mais sans les familles qui ne participent à aucun des 2 stages

  6. #6
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    vu que chacun des groupes de condition correspond à une des jointure ça devrait être rajouter avec un and dans la condition de la jointure visée

    à savoir qu'un outer join génère des lignes supplémentaires pour chaque partie d'une la jointure qui génère un résultat de plus d'une ligne

  7. #7
    Nouveau membre du Club
    Inscrit en
    Décembre 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : Décembre 2010
    Messages : 27
    Points : 28
    Points
    28
    Par défaut
    Si je fait dans le WHERE
    pfJ.cdStage=1 AND pfA.cdStage=3
    Il va me lier que les familles qui participent aux stages 1 et 3

  8. #8
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    non avec or

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT f.cdFam AS codeFam,
    f.nomFam AS famille,
    f.adFam AS adresse,
    IFNULL(pfJ.nbStagiaire,'0') AS nbStagiaireJuillet,
    IFNULL(pfA.nbStagiaire,'0') AS nbStagiaireAout
    FROM famille f 
    LEFT JOIN participation_famille pfJ ON pfJ.cdFam=f.cdFam 
    LEFT JOIN participation_famille pfA ON pfA.cdFam=f.cdFam 
    WHERE 
    pfJ.cdStage=1 OR pfA.cdStage=3

  9. #9
    Nouveau membre du Club
    Inscrit en
    Décembre 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : Décembre 2010
    Messages : 27
    Points : 28
    Points
    28
    Par défaut
    Je ne comprends pas trés bien le principe de OUTER JOIN ?

    Si je mets la même chose dans le WHERE mais avec un OR, ça me liste toutes le familles qui participent à des stages et en triple apr exmple ceux qui participent au 1, 3 et 1,3

  10. #10
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    "left join" c'est en fait "left outer join"

    en fait, ça équivaut à ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT f.cdFam AS codeFam,
    f.nomFam AS famille,
    f.adFam AS adresse,
    IFNULL(pfJ.nbStagiaire,'0') AS nbStagiaireJuillet,
    IFNULL(pfA.nbStagiaire,'0') AS nbStagiaireAout
    FROM famille f 
    LEFT JOIN participation_famille pfJ ON pfJ.cdFam=f.cdFam and pfJ.cdStage=1
    LEFT JOIN participation_famille pfA ON pfA.cdFam=f.cdFam and pfA.cdStage=3
    le where normalement limite le nombre de lignes que tu sors, par exemple en limitant ta recherche à une famille particulière...

  11. #11
    Nouveau membre du Club
    Inscrit en
    Décembre 2010
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 32

    Informations forums :
    Inscription : Décembre 2010
    Messages : 27
    Points : 28
    Points
    28
    Par défaut
    Purée mais ça marche !!!
    Je ne savais pas qu'on devait mettre la restriction de jointure dans le JOIN
    J'avais l'habitude avec oracle de faire la jointure dans le WHERE avec un (+) à droite si LEFT JOIN ou a gauche si RIGHT JOIN et la condition sur ces jointure dans le where, mais apparement avec cette syntaxe la condition ce mets dans le JOIN ! et si jamais je la mets dans le WHERE ça deconne ! :p

    Coule Alors !

    Merci !!!!!!!!!!

  12. #12
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    tu peux faire ça sur tous les sgbd normalement vu que c'est une écriture ansi...

    ta condition de jointure ne porte donc pas forcément sur un seul critère...

    tout ce qu'il y a entre le "on" et la déclaration d'une autre jointure ou d'un where éventuelle affectera la jointure en cours donc.

    de rien

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

Discussions similaires

  1. Requete sql qui marche pas.
    Par thebarbarius dans le forum Langage
    Réponses: 11
    Dernier message: 06/10/2012, 11h27
  2. Requete sql qui marche pas
    Par jahno dans le forum WinDev
    Réponses: 1
    Dernier message: 20/07/2007, 13h17
  3. [MySQL] requete sql qui ne s'exécute pas
    Par anto48_4 dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 16/03/2006, 10h12
  4. Réponses: 2
    Dernier message: 06/06/2005, 16h13
  5. Réponses: 2
    Dernier message: 04/06/2004, 12h11

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