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 :

[Jointure] Plusieurs tables


Sujet :

Requêtes MySQL

  1. #1
    Membre averti

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    638
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 638
    Points : 408
    Points
    408
    Par défaut [Jointure] Plusieurs tables
    Bonjour,

    Pour mon application, j'ai les tables suivantes :
    • bl_module (liste des modules)
    • bl_module_action (association entre modules et actions)
    • bl_action (liste des actions)
    • bl_action_profile (associations entre actions et profils)
    • bl_profile (liste des profils)

    Je voudrais obtenir pour un profil donné une liste complète des actions avec le profil associé, ou bien null si aucune association n'existe entre l'action et le profil indiqué en paramètre. J'ai essayé la requête suivante, sans succès :

    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
    select
      bl_action.action_id,
      bl_action.description as action_name,
      bl_action_profile.profile_id,
      bl_profile.name as profile_name,
      bl_module.description as module_name
    from bl_action
      left join bl_action_profile
          on bl_action.action_id=bl_action_profile.action_id
      left join bl_profile
          on bl_action_profile.profile_id=bl_profile.profile_id
      left join bl_module_action
          on bl_action.action_id=bl_module_action.action_id
      left join bl_module
          on bl_module.module_id=bl_module_action.module_id
    where bl_action_profile.profile_id=1

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE bl_action_profile.profile_id=1 OR bl_action_profile.action_id IS NULL
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Membre averti

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    638
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 638
    Points : 408
    Points
    408
    Par défaut
    Citation Envoyé par Antoun
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE bl_action_profile.profile_id=1 OR bl_action_profile.action_id IS NULL
    Non, ça ne fonctionne pas.

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

    Informations forums :
    Inscription : Février 2005
    Messages : 101
    Points : 64
    Points
    64
    Par défaut
    Je ne vois pas où est le problème. Quand l'id de bl_action_profile.profile_id n'existe pas ta requête ne te renvoi rien et c'est ce que tu veux.

    Je ne comprend pas trop ton pb

  5. #5
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    je relis ta description... tu dis que tu veux la liste complète des profils. Cela veut dire que c'est bl_profile qui devrait être obligatoire (donc à gauche de tous les LEFT JOIN) et non bl_action.

    Il faut donc que tu modifies ta requête en plaçant bl_profile comme première table (et sans oublier mon OR ... IS NULL).
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  6. #6
    Membre averti

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    638
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 638
    Points : 408
    Points
    408
    Par défaut
    Non je veux la liste complète des actions, pour un profil donné.

  7. #7
    Membre habitué
    Inscrit en
    Juillet 2003
    Messages
    196
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 196
    Points : 165
    Points
    165
    Par défaut
    Slt,

    Si tu élimines la clause WHERE que ce passe t'il ?

  8. #8
    Membre averti

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    638
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 638
    Points : 408
    Points
    408
    Par défaut
    Bonjour,

    J'ai modifié mon modèle de donné, et supprimé la table bl_module_action qui était inutile. Ma requête devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT bl_action.action_id, bl_action.description AS action_name, bl_action_profile.profile_id, bl_profile.name AS profile_name, bl_module.description AS module_name
    FROM bl_action
    LEFT JOIN bl_action_profile ON bl_action.action_id = bl_action_profile.action_id
    LEFT JOIN bl_profile ON bl_action_profile.profile_id = bl_profile.profile_id
    LEFT JOIN bl_module ON bl_module.module_id = bl_action.module_id
    WHERE bl_action_profile.profile_id =1
    LIMIT 0 , 30
    Si je supprime la clause WHERE j'obtiens les associations avec tous les profils. Ce n'est pas ce que je cherche.

    Je voudrais obtenir pour un profil donné, une liste complète des actions, avec l'identifiant du profil associé ou Null si ce profil n'est pas associé à cette action. Mais il semble que cela ne soit pas possible sous MySQL.

  9. #9
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Tu as essayé comme t'as dis Antoun ?

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT bl_action.action_id, bl_action.description AS action_name, bl_action_profile.profile_id, bl_profile.name AS profile_name, bl_module.description AS module_name
    FROM  bl_action_profile AP
    LEFT JOIN  bl_action A 
      ON AP.action_id = A.action_id
    LEFT JOIN bl_profile P 
      ON AP.profile_id =P.profile_id
    LEFT JOIN bl_module M 
      ON A.module_id = M.module_id
    WHERE AP.profile_id =1

    Après, je suis pas sûr que tous les LEFT JOIN soient nécessaires.

  10. #10
    Membre averti

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    638
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 638
    Points : 408
    Points
    408
    Par défaut
    Citation Envoyé par Xunil
    Tu as essayé comme t'as dis Antoun ?

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT bl_action.action_id, bl_action.description AS action_name, bl_action_profile.profile_id, bl_profile.name AS profile_name, bl_module.description AS module_name
    FROM  bl_action_profile AP
    LEFT JOIN  bl_action A 
      ON AP.action_id = A.action_id
    LEFT JOIN bl_profile P 
      ON AP.profile_id =P.profile_id
    LEFT JOIN bl_module M 
      ON A.module_id = M.module_id
    WHERE AP.profile_id =1

    Après, je suis pas sûr que tous les LEFT JOIN soient nécessaires.
    Oui. Ca ne donne pas ce que je veux.

  11. #11
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Citation Envoyé par Neuromancien2
    Oui. Ca ne donne pas ce que je veux.
    Si j'ai bien suivi il faudrait partir des profiles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT bl_action.action_id, bl_action.description AS action_name, bl_action_profile.profile_id, bl_profile.name AS profile_name, bl_module.description AS module_name
    FROM bl_profile P
         LEFT JOIN bl_action_profile AP ON AP.profile_id = P.profile_id
         LEFT JOIN bl_action A ON AP.action_id = A.action_id
         LEFT JOIN bl_module M ON A.module_id = M.module_id
    WHERE P.profile_id = 1

  12. #12
    Membre averti

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    638
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 638
    Points : 408
    Points
    408
    Par défaut
    En attendant de pouvoir tester la dernière requête, j'ai une autre question qui se rapproche de la première : Peut-on utiliser un LEFT JOIN avec une condition sur la table de jointure, en renvoyant NULL lorsque l'élément de la première table n'a pas de correspondance dans la seconde ? Aucun des exemple que j'ai pu voir ne comportait de condition.

    Exemple : Obtenir tous les utilisateurs possédant un véhicule de type 1, avec id du véhicule à NULL si l'utilisateur ne possède pas de véhicule de type 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select utilisateur.*, ut_vehicule.*
    from utilisateur
    left join ut_vehicule on utilisateur.u_id=ut_vehicule.u_id
    where vehicule.type=1
    La requête suivant peut-elle me donner le résultat attendu ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select utilisateur.*, ut_vehicule.*
    from utilisateur
    left join (select ut_vehicule where vehicule.type=1) as t2
    on utilisateur.u_id=ut_t2.u_id

  13. #13
    Membre averti

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    638
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 638
    Points : 408
    Points
    408
    Par défaut
    Ma nouvelle requête ne fonctionne toujours pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT bl_module.module_id AS module_id, bl_module.name AS module_name, bl_action.action_id, bl_action.name AS action_name, bl_action_profile.action_id, bl_action_profile.profile_id
    FROM bl_module, bl_action
    LEFT JOIN bl_action_profile ON bl_action.action_id = bl_action_profile.action_id
    WHERE if( bl_action_profile.action_id =0
    OR bl_action_profile.action_id IS NULL , 1 =1, bl_action_profile.profile_id =2 )
    AND bl_module.module_id = bl_action.module_id

  14. #14
    Membre averti

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    638
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 638
    Points : 408
    Points
    408
    Par défaut
    Merci pour vos réponses. En l'absence de solution en SQL j'ai fait autrement.

Discussions similaires

  1. JOINTURE - Plusieurs tables
    Par sebgosse dans le forum Requêtes
    Réponses: 3
    Dernier message: 25/02/2009, 18h27
  2. jointure plusieurs tables
    Par midosd dans le forum Langage SQL
    Réponses: 5
    Dernier message: 24/12/2008, 11h35
  3. [MySQL] requête de jointure plusieurs table
    Par info_sara dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 23/05/2008, 13h35
  4. Requete SQL jointure plusieurs tables
    Par bibicha dans le forum Langage SQL
    Réponses: 1
    Dernier message: 31/08/2006, 17h38
  5. jointures de plusieurs tables
    Par ben127 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 09/06/2004, 14h57

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