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

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    septembre 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : septembre 2011
    Messages : 34
    Points : 38
    Points
    38

    Par défaut Requête SQL avec table association éventuelle

    Bonjour à tous,

    Première fois que je demande de l'aide, je vous en remercie par avance.
    Je sèche. Malgré de nombreuses recherches et tentatives, je ne parviens pas à réaliser la requête souhaitée.

    Voici mon schéma de tables :
    Nom : Sans titre.png
Affichages : 65
Taille : 88,1 Ko

    Précision : Lors de l'insertion d'une nouvelle catégorie, un message optionnel peut être joint.

    Je souhaite obtenir toutes les catégories clients, qu'elles est ou non un message, mais si elles ont un message, il doit être d'un type_message précis.
    Et cela en une seule requête.

    Encore merci pour votre aide.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    8 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 8 041
    Points : 25 941
    Points
    25 941

    Par défaut

    Précisons bien : tu veux les catégories de client qui soit n'ont aucun message, soit ont un message d'un type particulier.
    C'est bien ça ?
    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
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    septembre 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : septembre 2011
    Messages : 34
    Points : 38
    Points
    38

    Par défaut

    Oui c'est ça, et en une seule requête.

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    8 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 8 041
    Points : 25 941
    Points
    25 941

    Par défaut

    Qu'as-tu déjà essayé ?
    Où renontres-tu un problème ?
    Tu peux éventuellement répondre à ta question en faisont une UNION entre deux requêtes qui répondent chacune à l'une des conditions
    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
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    septembre 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : septembre 2011
    Messages : 34
    Points : 38
    Points
    38

    Par défaut

    J'ai essayé différents types de requêtes avec différentes jointures, des NULL, EXISTS et même UNION, sans résultat.
    J'avoue m'y perdre dans le sens des conditions.

    Voici une esquisse de requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT cc.designation, m.message FROM categorie_client cc JOIN categorie_client_a_message cchm ON cc.id = cchm.categorie_client_id JOIN message m ON cchm.message_id = m.id WHERE m.detail IS NULL
     
    UNION
     
    SELECT cc.designation, m.message FROM categorie_client cc JOIN categorie_client_a_message cchm ON cc.id = cchm.categorie_client_id JOIN message m ON cchm.message_id = m.id WHERE m.type_message_id = 2;
    Merci pour le temps consacré à mon problème.

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    8 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 8 041
    Points : 25 941
    Points
    25 941

    Par défaut

    Il suffit de pas grand chose, juste une jointure externe
    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
    18
    19
    20
    21
    22
    SELECT  cc.designation
        ,   m.message
    FROM    categorie_client            cc 
        LEFT JOIN   
            categorie_client_a_message  cchm
            ON  cc.id = cchm.categorie_client_id
        INNER JOIN
            message                     m 
            ON  cchm.message_id = m.id
    WHERE   m.detail    IS NULL
    UNION ALL
    SELECT  cc.designation
        ,   m.message
    FROM    categorie_client            cc 
        INNER JOIN   
            categorie_client_a_message  cchm
            ON  cc.id = cchm.categorie_client_id
        INNER JOIN
            message                     m 
            ON  cchm.message_id = m.id
    WHERE    m.type_message_id = 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.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    septembre 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : septembre 2011
    Messages : 34
    Points : 38
    Points
    38

    Par défaut

    Merci pour cette proposition de requête. Malheureusement, elle aboutit à un résultat semblable à mes précédentes tentatives : elle ne retourne pas tout ce qui est souhaité.

    La deuxième requête (après le UNION ALL) fonctionne très bien, mais la première ne retourne aucune ligne. J'ai tenté de modifier les types de jointure, NULL avec NOT EXISTS. Mais rien n'y fait.

    Une idée ?

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    janvier 2010
    Messages
    5 124
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2010
    Messages : 5 124
    Points : 10 564
    Points
    10 564

    Par défaut

    Bonjour,

    Dans la requete d'al1_24, je pense qu'il faut juste passer la deuxiéme jointure de la première requete en jointure externe (ou l'imbriquer dans la jointure extrrne comme je l'ai fait ci-dessous).

    Sinon, ceci devrait fonctionner si j'ai bien compris le problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT cc.designation
        ,   m.message
    FROM categorie_client cc
    LEFT JOIN	categorie_client_a_message ccm
    			INNER JOIN message m
    				ON m.id = ccm.message_id
    	ON ccm.categorie_client_id = cc.id
    GROUP BY cc.designation
        ,   m.message
    HAVING COUNT(NULLIF(m.type_message_id , 2)) = 0

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    septembre 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : septembre 2011
    Messages : 34
    Points : 38
    Points
    38

    Par défaut

    Bonjour aieeeuuuuu,

    Merci pour la réponse, effectivement tes deux solutions fonctionnent. Merci !
    Je vais prendre le temps de bien décortiquer ta 2ème proposition, pour bien la comprendre.

    Merci à tous pour le temps consacré.
    Bon codage

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    septembre 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : septembre 2011
    Messages : 34
    Points : 38
    Points
    38

    Par défaut

    Je tente d'adapter un peu plus cette requête en récupérant toutes les catégories, avec un booléen qui indique si elles ont un message de type_message_id = 2. Cela en une seule requête.
    Mais je sèche, auriez-vous des pistes svp ?

  11. #11
    Modérateur

    Profil pro
    Inscrit en
    janvier 2010
    Messages
    5 124
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2010
    Messages : 5 124
    Points : 10 564
    Points
    10 564

    Par défaut

    comme ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    SELECT cc.designation
        ,   m.message
        ,   CAST(COUNT(NULLIF(m.type_message_id , 2)) AS BIT) AS HasTypeDeux
    FROM categorie_client cc
    LEFT JOIN	categorie_client_a_message ccm
    			INNER JOIN message m
    				ON m.id = ccm.message_id
    	ON ccm.categorie_client_id = cc.id
    GROUP BY cc.designation
        ,   m.message

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    septembre 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : septembre 2011
    Messages : 34
    Points : 38
    Points
    38

    Par défaut

    Merci pour ta réponse aieeeuuuuu, ton aide m'est précieuse ! L'idée est là.
    J'ai modifié ta requête car MySQL n'accepte pas le CAST en BIT, et que je ne souhaite pas récupérer les messages mais seulement savoir si pour chaque catégorie, il existe un ou des messages de type_message_id = 2.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT cc.designation
        , CAST(COUNT(NULLIF(m.type_message_id , 2)) AS BINARY) AS HasTypeDeux
    FROM categorie_client cc
    LEFT JOIN	categorie_client_a_message ccm ON ccm.categorie_client_id = cc.id
    INNER JOIN message m ON m.id = ccm.message_id
    GROUP BY cc.designation, m.type_message_id
    On n'est plus très loin du résultat souhaité, mais il reste 2 problèmes avec les résultat obtenus par cette requête :
    - Les valeurs binaires HasTypeDeux sont inversées;
    - Il y a des doublons de catégorie quand elles ont des messages de plusieurs type_message_id. DISTINCT ne donne aucun résultat.

    Quelles seraient selon toi les erreurs ?

Discussions similaires

  1. Requête HQL avec tables associatives
    Par mecha31 dans le forum Hibernate
    Réponses: 1
    Dernier message: 15/05/2015, 13h32
  2. Requète SQL avec nom de table contenu dans une variable
    Par samoussa dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/05/2009, 13h58
  3. Requête SQL avec jointure sur trois tables
    Par pit2121 dans le forum SQL
    Réponses: 0
    Dernier message: 19/05/2008, 20h24
  4. Requête SQL avec création de table sous condition
    Par misig dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 04/11/2007, 08h58
  5. [SQL] Requête SQL avec 3 tables liées par la même relation
    Par lenstoi dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 28/08/2007, 23h32

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