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 :

Requête sur 3 tables (relation (n,n))


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 17
    Points : 13
    Points
    13
    Par défaut Requête sur 3 tables (relation (n,n))
    Je travaille avec 3 tables : utilisateur, rôle et la table de liaision util_role car un utilisateur peut avoir plusieurs rôles et inversement.

    Ma requête consiste à récupérer tous les utilisateurs ayant 2 rôles précis : disons rôle A et rôle B mais aussi de récupérer tous les rôles qu'ont ces utilisateurs ... Je tourne en rond, je n'ai toujours pas trouvé de solution en 1 seule requête ...

    Merci pour une éventuelle aide de votre part

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 081
    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 081
    Points : 30 828
    Points
    30 828
    Par défaut
    Pourriez-vous nous présenter une ébauche de la requête que vous tentez de mettre au point ainsi que la structure des tables.
    Cela sera plus facile pour vous aider à la faire évoluer.
    En précisant le SGBD que vous utilisez et sa version, les réponses proposées seront adaptées aux spécificités et limitations de celui-ci.
    Règles du forum Langage SQL à lire par tous
    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.

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    3 tables :
    utilisateur : id_utilisateur etc...
    role : id_role etc ...
    util_role : id_utilisateur, id_role

    L'ébauche de la requête et bien, je doute que vous la montrer vous aide car des ébauches j'en ai une trentaine mais bon en voilà une au hasard :

    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_utilisateur, id_role from utilisateur u, role r, util_role ur
    where u.id_utilisateur = ur.id_utilisateur
    and ur.id_role = r.id_role
    and u.id_utilisateur in
    (select distinct id_utilisateur from utilisateur u, role r, util_role ur
    where u.id_utilisateur = ur.id_utilisateur
    and ur.id_role = r.id_role
    and exists (
    (select ur.id_role from util_role ur where ur.id_role = 21)
    )
    and exists (
    (select ur.id_role from util_role ur where ur.id_role = 7)
    )
    )
    Je travaille avec une base postGre 8.1.9, j'appelle la requête à partir d'une servlet.

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 081
    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 081
    Points : 30 828
    Points
    30 828
    Par défaut
    En supposant que (id_utilisateur, id_role) est bien clé unique de util_role :
    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
    SELECT  usr.id_utilisateur
        ,   rol.id_role 
    FROM    utilisateur AS usr
        INNER JOIN
            util_role   AS utr
            ON  usr.id_utilisateur = utr.id_utilisateur
        INNER JOIN
            role        AS rol
            ON  utr.id_role = rol.id_role
    WHERE   EXISTS 
            (   SELECT  1
                FROM    util_role AS url 
                WHERE   url.id_role IN (21, 7)
                    AND url.id_utilisateur = usr.id_utilisateur
                HAVING  COUNT(*) = 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.

  5. #5
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Que dire à part "Merci" ?
    Merci al1_24, je ne ferai pas de cauchemards ce soir

  6. #6
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Simple question subsidiaire :
    Dans la clause suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE   url.id_role IN (21, 7)
    Que dois-je faire si je veux que 21 soit associé à 7 mais également à 8 ou 9 ou 10 etc ...
    Quelque chose comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WHERE   (url.id_role IN (21, 7) 
    OR url.id_role IN (21, 8) 
    OR url.id_role IN (21, 9)
    La condition étant que si au moins une seule de ces associations est valide, on renvoie la ligne trouvée.

  7. #7
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 081
    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 081
    Points : 30 828
    Points
    30 828
    Par défaut
    Il faut donc qu'il existe au moins une ligne avec le rôle 21 et une ave l'un des rôles 7, 8 ou 9
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    WHERE   EXISTS 
            (   SELECT  1
                FROM    util_role AS url 
                WHERE   url.id_role = 21
                    AND url.id_utilisateur = usr.id_utilisateur
            )
        AND EXISTS 
            (   SELECT  1
                FROM    util_role AS url 
                WHERE   url.id_role IN (7, 8, 9)
                    AND url.id_utilisateur = usr.id_utilisateur
            )
    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.

  8. #8
    Membre à l'essai
    Inscrit en
    Septembre 2007
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Merci bien, cette fois-ci c'est parfaitement résolu

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

Discussions similaires

  1. Requête sur une table de relation 0,n - 0,n
    Par Jmdu_44fr dans le forum SQL
    Réponses: 4
    Dernier message: 22/09/2011, 16h28
  2. Problème de requêtes sur deux tables
    Par Pymm dans le forum Access
    Réponses: 6
    Dernier message: 06/09/2005, 09h06
  3. Requête sur plusieurs tables
    Par drinkmilk dans le forum Langage SQL
    Réponses: 8
    Dernier message: 11/07/2005, 12h25
  4. Requête sur 2 tables ?
    Par kibodio dans le forum Langage SQL
    Réponses: 3
    Dernier message: 30/03/2005, 15h57
  5. Requête sur 2 tables et surtout novice...
    Par kibodio dans le forum Langage SQL
    Réponses: 13
    Dernier message: 03/03/2005, 15h45

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