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 avec condition en AND sur deux tables


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué Avatar de sologne
    Homme Profil pro
    Chargé de missions
    Inscrit en
    Mai 2011
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chargé de missions
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2011
    Messages : 73
    Points : 125
    Points
    125
    Par défaut Requête avec condition en AND sur deux tables
    Bonjour à tous,

    Je viens vers vous car je suis face à une requête sur laquelle je bloque.

    Voici un extrait de ma base avec les trois tables concernées qui modélisent le fait qu'un correspondant peux posséder plusieurs compétences affinées (commp_aff) et qu'une compétence affinée peut-être possédée par plusieurs correspondant.

    Les deux autres clefs étrangères : ID_Organisme_FK, et ID_Champ_Comp_FK modélisent le fait qu'un correspondant travail pour un organisme et un seul et qu'une compétence affinée fait partie d'un champ de compétences.

    ----------------- Début : Les trois tables --------------------

    correspondant(ID_Cor,ID_Organisme_FK,Civil_Cor,Nom_Cor,Prenom_Cor,Tel_Cor,Fax_Cor,Port_Cor,Mail_Cor,Login,Pwd,Droits,Etat)

    asso_cor_comp_aff(ID_Asso_Cor_Comp_aff,ID_Cor_FK,ID_Comp_aff_FK)

    comp_aff(ID_Comp_aff,ID_Champ_Comp_FK,Descriptif_aff)

    ----------------- Fin : Les trois tables --------------------

    Je cherche à obtenir : "Les correspondants qui possèdent la compétence affinée 1 ET la compétence affinée 3 ET la compétence affinée 7"

    En fait il peut y avoir plusieurs compétence affinée qui doivent s'enchainer avec un ET

    Et là je bloque ... toutes les requêtes que j'ai tenté n'aboutissent pas.

    Avez-vous une idée svp ?

    Par avance merci à ceux qui pourront m'aider.

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Je pense à quelque chose comme ça
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT  ID_Cor
    FROM correspondant AS c
    INNER JOIN  asso_cor_comp_aff AS a1 ON c.ID_Cor=a1.ID_Cor AND a1. ID_Comp_aff_FK=1
    INNER JOIN  asso_cor_comp_aff AS a2 ON c.ID_Cor=a2.ID_Cor AND a2. ID_Comp_aff_FK=3
    INNER JOIN  asso_cor_comp_aff AS a3 ON c.ID_Cor=a3.ID_Cor AND a3. ID_Comp_aff_FK=7
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Membre habitué Avatar de sologne
    Homme Profil pro
    Chargé de missions
    Inscrit en
    Mai 2011
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chargé de missions
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2011
    Messages : 73
    Points : 125
    Points
    125
    Par défaut
    Re bonjour,
    A force de chercher, je viens d'écrire cela qui fonctionne pour 2 conditions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT ID_Cor_FK
    FROM asso_cor_comp_aff
    WHERE ID_Comp_aff_FK =10
    AND ID_Cor_FK IN (
    	SELECT ID_Cor_FK
    	FROM asso_cor_comp_aff
    	WHERE ID_Comp_aff_FK =13
    )
    et cela qui fonctionne pour 3 conditions :
    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 ID_Cor_FK
    FROM asso_cor_comp_aff
    WHERE ID_Comp_aff_FK =10
    AND ID_Cor_FK IN (
    	SELECT ID_Cor_FK
    	FROM asso_cor_comp_aff
    	WHERE ID_Comp_aff_FK =13
    	AND ID_Cor_FK IN (
    		SELECT ID_Cor_FK
    		FROM asso_cor_comp_aff
    		WHERE ID_Comp_aff_FK =17
    	)
    )
    Par contre l'utilisateur peux cocher jusqu'à 30 conditions ...
    Donc avez-vous une idée pour écrire cela plus simplement car je vais avoir une requête qui va exploser ...

  4. #4
    Membre habitué Avatar de sologne
    Homme Profil pro
    Chargé de missions
    Inscrit en
    Mai 2011
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chargé de missions
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2011
    Messages : 73
    Points : 125
    Points
    125
    Par défaut [Résolu]
    Merci Maljuna Kris,

    la solution que tu proposes me simplifie terriblement la solution que je venais te trouver juste après toi, et est donc meilleur.
    J'ai juste apporté une petite correction car la référence à la clé étrangère dans la table associative n'était pas la bonne.
    Voici donc la requête finale qui tourne. (Je viens de la tester)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT  ID_Cor
    FROM correspondant AS c
    INNER JOIN  asso_cor_comp_aff AS a1 ON c.ID_Cor=a1.ID_Cor_FK AND a1.ID_Comp_aff_FK=1
    INNER JOIN  asso_cor_comp_aff AS a2 ON c.ID_Cor=a2.ID_Cor_FK AND a2.ID_Comp_aff_FK=3
    INNER JOIN  asso_cor_comp_aff AS a3 ON c.ID_Cor=a3.ID_Cor_FK AND a3.ID_Comp_aff_FK=7
    Encore merci de ton aide

    Cordialement,
    Sologne

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

Discussions similaires

  1. Condition en SAS sur deux tables
    Par tassia dans le forum Débutez
    Réponses: 6
    Dernier message: 27/06/2012, 09h37
  2. Réponses: 2
    Dernier message: 31/10/2011, 13h48
  3. Requête d'un même champ sur deux tables
    Par laipreu dans le forum Requêtes
    Réponses: 1
    Dernier message: 18/09/2008, 13h38
  4. [SQL] Problème avec script de pagination et requête sql sur deux tables
    Par psychoBob dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/06/2006, 14h06
  5. Réponses: 9
    Dernier message: 21/11/2005, 18h51

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