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 requête sql pour une recherche


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 13
    Points : 5
    Points
    5
    Par défaut Problème requête sql pour une recherche
    Bonjour,

    J'ai un pb avec une requête sql que je dois effectuer.

    J'ai une table avec des inscrits et des tables avec un listing de compétences possible pour ces inscrits. J'ai des tables intermédiaires pour chaque table de compétences possible.

    La table d'inscrits contient un champs d'identifiant et d'autres infos inutile pour mom problème.
    Les tables de compétence sont toute structuré pareil a savoir un numéro id unique et le titre de cette compétence.
    Les tables intermédiaires contiennent l'id de l'inscrit et l'id de la compétence que l'inscrit possède sachant qu'il peut posséder évidement plusieurs compétences dans la même table donc on peut avoir :

    id_inscrit | id_compétence
    1 | 18
    1 | 21
    1 | 35
    2 | 21
    2 | 36


    Mon objectif est de faire une grosse requête qui me sortira l'id ou les id des inscrits qui ont par exemple les compétences 18 et 21 d'une table de compétence donné ainsi que les compétence 51,17 et 37 d'une autre table de compétence etc.

    La solution est surement pas si compliqué mais je coince...

    Ma requête ressemble a ça pour le moment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT distinct postul.id_postul 
    FROM postul, postul_cfcb, postul_domaines, postul_domaines_sn1, postul_domaines_sn2, postul_domaines_sn3
    WHERE postul.id_postul=postul_cfcb.id_postul
    AND postul.id_postul=postul_domaines.id_postul
    AND postul.id_postul=postul_domaines_sn1.id_postul
    AND postul.id_postul=postul_domaines_sn2.id_postul
    AND postul.id_postul=postul_domaines_sn3.id_postul
    AND postul_domaines.id_domaine=111
    AND postul_cfcb.id_cfcb=1 
    AND postul_cfcb.id_cfcb=2
    Là ou ça coince c'est mes deux dernière ligne qui interroge sur le même champ, s'il n'y en a qu'une ça passe, mais deux ou plus ça coince il ne me donne plus aucun résultats. Sachant que les 3 dernière lignes sont ajouté automatiquement par mon code php (la bdd est avec mysql) en fonction de ce que l'on recherche, et la liste peut être longue.

    En espérant avoir expliqué mon problème assez clairement.
    Merci d'avance.

  2. #2
    Membre expérimenté
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Points : 1 413
    Points
    1 413
    Par défaut
    C'est peut être plutôt un OR qu'il faut que tu utilises

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT DISTINCT postul.id_postul 
    FROM postul, postul_cfcb, postul_domaines, postul_domaines_sn1, postul_domaines_sn2, postul_domaines_sn3
    WHERE postul.id_postul=postul_cfcb.id_postul
    AND postul.id_postul=postul_domaines.id_postul
    AND postul.id_postul=postul_domaines_sn1.id_postul
    AND postul.id_postul=postul_domaines_sn2.id_postul
    AND postul.id_postul=postul_domaines_sn3.id_postul
    AND postul_domaines.id_domaine=111
    AND (postul_cfcb.id_cfcb=1 
    OR postul_cfcb.id_cfcb=2)
    Après ne connaissant pas ton schéma ce n'est qu'une supposition
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.

  3. #3
    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
    Pour commencer, je trouve cette structure bizarre !
    J'ai une table avec des inscrits et des tables avec un listing de compétences possibles pour ces inscrits. J'ai des tables intermédiaires pour chaque table de compétences possible.

    Les tables de compétences sont toutes structurées pareil
    Pourquoi DES tables pour les compétences ?

    Règle de gestion :
    "Un inscrit peut posséder de une à plusieurs compétences et une compétence peut être possédée par zéro à plusieurs inscrits."

    MCD :
    Inscrit -1,n----Posséder----0,n- Compétence

    Tables :
    Inscrits (I_Id, I_Nom, ...)
    Competences (C_Id, C_Libelle, ...)
    Posseder (P_IdInscrit, P_IdCompetence, ...)

    Ensuite, l'écriture normalisée des jointures est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FROM unetable
    [INNER] [LEFT/RIGHT OUTER] JOIN uneautretable ON conditiondejointure
    Enfin, un problème similaire a déjà été évoqué récemment.
    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 !

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    - Non le "or" n'est pas possible car il faut que les deux conditions soit réalisé.

    - Plusieurs tables n'est pas le mieux c'est sur mais ça a été fait pour simplifier certaines choses au niveau du code, et des personnes qui n'y connaisse pas grands choses de rajouter facilement des compétences. Il y a en fait une table "parent" puis un sous-niveau qui en dépends, puis un deuxième et un troisième etc... bon il y avait surement plus simple mais maintenant que c'est comme ça et qu'il ne me reste plus que cette requête a faire, je verrais après pour les améliorations.

    J'avais déjà regardé ce topic avant de poster, mais j'ai du mal a l'appliquer a mon cas, je vais y regarder de plus près en attendant.

    Merci pour vos réponses rapide.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Bon j'ai re-écrit la requête plus proprement déjà.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT distinct postul.id_postul
    FROM postul
    INNER JOIN postul_cfcb ON postul.id_postul=postul_cfcb.id_postul
    INNER JOIN postul_domaines ON postul.id_postul=postul_domaines.id_postul
    INNER JOIN postul_domaines_sn1 ON postul.id_postul=postul_domaines_sn1.id_postul
    INNER JOIN postul_domaines_sn2 ON postul.id_postul=postul_domaines_sn2.id_postul
    INNER JOIN postul_domaines_sn3 ON postul.id_postul=postul_domaines_sn3.id_postul
    Mais j'ai évidement tjs le même pb a savoir que je souhaite rajouté dynamiquement des variable du type AND postul_domaines.id_domaine=111 a la suite de cette requête, mais que des que j'en ai deux pareil, par exemple AND postul_domaines.id_domaine=111 suivi de AND postul_domaines.id_domaine=105 je n'ai plus aucun résultat alors que s'il n'y en a qu'une ça marche bien.

    Edit : je peux bien sur rajouté mes variables a tester différemment en fonction de la bonne méthode pour exécuter la requête.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Et c'est normal. Une valeur ne peut pas valloir simultanément 1 et 2.

    Vous pouvez soit faire des OR ou un IN, mais j'imagine que vous expliquez mal ce que vous voulez faire.

    Un exemple serait le bienvenu (avec des données et le résultat attendu).

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    yes

    Alors par exemple pour faire simple :

    une table compétence :
    id_inscrit | id_compétence
    1 | 18
    1 | 21

    1 | 35
    2 | 18
    2 | 21

    2 | 17
    3 | 01
    etc...

    une table inscrit :
    id_inscrit | divers
    1 | ...
    2 | ...
    2 | ...
    4 | ...

    Je souhaite connaitre les id_inscrit qui ont le couple de compétences 18 ET 21 uniquement, ni plus ni moins.
    J'aimerais donc avoir içi comme résultat 1 et 2.
    Après c'est un peu plus complexe car il y a plusieurs tables de compétences et autres sur le même schéma comme je l'ai expliqué précédemment, mais je pense que le cœur du problème est bien là ?

    18 et 21 sont en effet des valeur différente, je comprends bien le problème, mais elles sont aussi sur des enregistrement différents...

    J'avais bien testé avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND postul_domaines.id_domaine IN ('18','51','34')
    mais ce n'est pas exclusif, car là je souhaiterais qu'il ne me sorte rien du tout vu que je lui ai demandé le couple 18 et 21 seulement or là il me donne comme résultat 1 et 2 vu qu'il ont le 18 chacun.


    en espérant avoir été plus clair...

  8. #8
    Membre expérimenté
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Points : 1 413
    Points
    1 413
    Par défaut
    Regarde alors du coté de la fonction having.
    En gros tu recherches ceux qui ont 18 ou 21 avec (having) un count = 2
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Citation Envoyé par jbrasselet Voir le message
    Regarde alors du coté de la fonction having.
    En gros tu recherches ceux qui ont 18 ou 21 avec (having) un count = 2
    Je cherche ceux qui ont 18 ET 21, par exemple.

    J'ai un peu regardé du coté de having mais sans succès pour le moment, pourrais tu me développer un peu ton idée stp, ou me montrer un exemple.

    Je continu a chercher de mon coté, mais si quelqu'un a une idée je suis preneur. Merci.

  10. #10
    Membre expérimenté
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Points : 1 413
    Points
    1 413
    Par défaut
    Voici un exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT i.id_inscrit
    FROM inscrit i LEFT OUTER JOIN competence c ON i.id_inscrit=c.id_inscrit
    WHERE c.id_competence=18 OR c.id_competence=21
    GROUP BY i.id_inscrit
    HAVING COUNT(c.id_inscrit) = 2
    En espérant que cela réponde à ta question.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    oui ça marche merci beaucoup jbrasselet.
    Je test maintenant avec plus ou moins de variables et toute mes jointures.

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT p.id_postul
    FROM postul p 
    LEFT OUTER JOIN postul_domaines d ON p.id_postul=d.id_postul
    WHERE d.id_domaine=116 OR d.id_domaine=114
    GROUP BY p.id_postul
    HAVING COUNT(d.id_postul) = 2
    Alors avec plus ou moins de variables ça passe, j'en rajoute dans le "WHERE" et met a jour le "COUNT", impeccable.

    Par contre je dois avoir un pb avec mes jointures, il faut dire que je n'ai pas l'habitude des les faire comme cela, il y a donc peut-etre quelque chose que j'ai mal fait ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT p.id_postul
    FROM postul p 
    LEFT OUTER JOIN postul_domaines d ON p.id_postul=d.id_postul
    LEFT OUTER JOIN postul_domaines_sn1 d1 ON p.id_postul=d1.id_postul
    LEFT OUTER JOIN postul_domaines_sn2 d2 ON p.id_postul=d2.id_postul
    LEFT OUTER JOIN postul_domaines_sn3 d3 ON p.id_postul=d3.id_postul
    LEFT OUTER JOIN postul_cfcb c ON p.id_postul=c.id_postul
    WHERE d.id_domaine=116 OR d.id_domaine=114
    GROUP BY p.id_postul
    HAVING COUNT(d.id_postul) = 2
    La requête ne provoque pas d'erreur mais ne retourne aucun résultat alors qu'elle devrait logiquement (enfin je voudrais) retourner la même chose que la 1ere requête plus simple vu que je n'ai rajouté aucune clause dans le "WHERE"

  13. #13
    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
    C'est peut-être parce que id_postul a une correspondance dans les autres tables ? Du coup, COUNT(d.id_postul) devient > 2 et il n'y a plus de résultat !
    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 !

  14. #14
    Membre expérimenté
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Points : 1 413
    Points
    1 413
    Par défaut
    Oui cela peut en effet être une raison.
    Il faut que tu regardes l'ensemble des résultats fournis par ta requête sans le having histoire d'analyser le pourquoi de ce non résultat
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    J'ai fait un having > 0 pour voir, et en effet il me sors tous les champs qui ont 116 ou/et 114, alors que pour mon cas il faut bien que les 2 conditions soit réuni.
    Sinon dans chacune de mes tables où l'id_postul est rentré, il s'appelle en effet tous id_postul, mais ici on précise a chaque fois de quelle table il doit provenir : d.id_postul , c.id_postul etc. cela ne devrait pas poser de problème logiquement ?

  16. #16
    Membre expérimenté
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Points : 1 413
    Points
    1 413
    Par défaut
    Oui mais si par exemple dans tes tables sn1, sn2, sn3 tu as plusieurs occurences de id_inscrit alors ton count te ramènera plus d'enregistrement que prévu !

    Par exemple :
    dans ta table postul_domaines tu as 2 enregistrements pour l'id_postul 1 qui correspondent à 114 et 116

    Si dans ta table sn1 tu as 2 enregistrement pour ton id_postul à 1

    ton count te ramènera 4 (si je ne me trompes pas)
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.

  17. #17
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Oui le champ dans le count a une importance, lorsqu'il est nul (et comme vous faites des jointures externes ça doit arriver) ça compte bien 0 même si vous avez des informations provenant d'autre tables.

    Essayez avec la fin de requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    WHERE d.id_domaine IN (114, 116) -- préférez IN à OR lorsque vous travaille sur le même champ
    GROUP BY p.id_postul
    HAVING COUNT(p.id_postul) = 2 -- il faut bien mettre p.id_postul puisque c'est le champ qui vous intéresse
    -- COUNT(*) = 2 si vous êtes en jointure (0,1) ça doit fonctionner

  18. #18
    Membre expérimenté
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Points : 1 413
    Points
    1 413
    Par défaut
    Ca ne changera rien à son problème si dans ses autres jointures il y a plus d'une occurence de ramener car le résultat du count ne sera plus 2 !

    Une solution qui me vient ainsi est de faire une requête qui te ramène bien ce que tu veux avec juste la table des domaines et ensuite de l'utiliser en sous-requete pour faire les autres jointures.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.

  19. #19
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 789
    Points
    30 789
    Par défaut
    Tu dois compter les id_competence !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT i.id_inscrit
    FROM inscrit i LEFT OUTER JOIN competence c ON i.id_inscrit=c.id_inscrit
    WHERE c.id_competence=18 OR c.id_competence=21
    GROUP BY i.id_inscrit
    HAVING COUNT(DISTINCT c.id_competence) = 2
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  20. #20
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Merci pour vos réponses je vais regarder ça,

    En fait là j'ai simplifier un peu le truc c'est a dire que j'ai finalement fusionné les diverses tables de competences et modifié le code en fonction.

    Pour info maintenant j'utilise ce qu'on m'avais conseillé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT p.id_postul
    FROM postul p 
    LEFT OUTER JOIN postul_domaines d ON p.id_postul=d.id_postul
    WHERE
    et je complète la requête automatiquement en fonction des domaines de compétences souhaité. Je tiens un compteur pour le nombre de critère et je fini la requête avec le count. Ça a l'air de bien marcher.
    Ceci dit il me reste toujours une table a joindre sur la même structure que les autres...
    j'en suis donc maintenant a fusionner cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT p.id_postul
    FROM postul p 
    LEFT OUTER JOIN postul_domaines d ON p.id_postul=d.id_postul
    WHERE d.id_domaine=111 OR d.id_domaine=3221
    GROUP BY p.id_postul
    HAVING COUNT(d.id_postul) = 2
    avec une autre exactement du même type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT p.id_postul
    FROM postul p 
    LEFT OUTER JOIN postul_cfcb c ON p.id_postul=c.id_postul
    WHERE c.id_cfcb=3 OR c.id_cfcb=8
    GROUP BY p.id_postul
    HAVING COUNT(d.id_postul) = 2
    Et le résultat doit être le listing des p.id_postul possedant tous les id_domaine et tous les id_cfcb souhaité.

    Le pb reste le même mais ya plus que deux tables en fait ce sera déjà plus simple

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Requête SQL pour une base
    Par samuellion13 dans le forum Débuter
    Réponses: 1
    Dernier message: 21/07/2014, 16h25
  2. Une requête SQL pour une base de données
    Par clairetj dans le forum Requêtes
    Réponses: 4
    Dernier message: 24/04/2011, 21h02
  3. Réponses: 4
    Dernier message: 02/04/2009, 14h18
  4. [SQL] Comment feriez-vous cette requête pour une recherche ?
    Par Core8 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 06/02/2008, 11h58
  5. [SQL] Problème requête sql,rajouter une valeur,checbox
    Par snakejl dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 23/06/2006, 11h18

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