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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    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
    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 Expert
    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 : 46
    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
    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

  3. #3
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    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, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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
    Membre habitué
    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
    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
    Membre habitué
    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
    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
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    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
    Membre habitué
    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
    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...

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

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