Partage
  • Partager sur Facebook
  • Partager sur Twitter

MYSQL

requête vers une table

    17 octobre 2021 à 1:45:16

    Bonjour, (UNIQUEMENT DANS MYSQL AUCUN AUTRE LANGUAGE)!

    je suis bloquer dans un exercice je vous mets les données de la base de données la question est : 

    <Quelles sont les personnes qui ont envoyé un message à une femme et qui ont reçu un message d’un homme ?>

    j'ai trouver une réponse mais je voudrai avoir une réponse plus simple car je me suis pris la tête a faire cas par cas 

    SELECT M.ID_Message,M.Expediteur,D.Destinataire,P.SSN,P.Nom FROM
    
    personne AS P INNER JOIN message AS M ON P.SSN = M.Expediteur
    
    INNER JOIN destinataires AS D ON D.ID_Message = M.ID_Message
    
    WHERE D.ID_Message IN ('M2','M4','M6')
    
    ORDER by P.Nom;



    la reponse est bien: PAUL,REMY,XAVIER,XAVIER (les personnes qui ont contactés des femmes)

    Je voudrai savoir comment faire une requête pour dire quand le destinataire est une femme  affiche moi leurs prénoms? Faire un WHERE avec D.destinataire = P.sexe = 'F' puis de dire d'afficher ? L'idée est la mais je ne sais pas comment faire

    Bien à vous 

    *************************************

    Les informations dans la base de donnée

    **************************************

    INSERT INTO `Destinataires` (`ID_Message`, `Destinataire`) VALUES

    ('M2', 'P2'),

    ('M4', 'P2'),

    ('M1', 'P3'),

    ('M3', 'P3'),

    ('M1', 'P4'),

    ('M4', 'P5'),

    ('M6', 'P5'),

    ('M5', 'P6');

    ****************************************
    INSERT INTO `Message` (`ID_Message`, `Contenu`, `Date_Expedition`, `Expediteur`) VALUES
    ('M1', 'Bonjour', '2013-10-01', 'P1'),
    ('M2', 'Salut', '2013-10-02', 'P1'),
    ('M3', 'On va boire un verre ?', '2013-10-03', 'P2'),
    ('M4', 'Regarde cette vidéo de chat', '2013-10-04', 'P4'),
    ('M5', 'LOL', '2013-10-05', 'P5'),
    ('M6', 'Trololololol', '2013-10-06', 'P6');
    *********************************************
    INSERT INTO `Personne` (`SSN`, `Nom`, `Sexe`, `Age`) VALUES
    ('P1', 'Paul', 'M', '28'),
    ('P2', 'Julie', 'F', '28'),
    ('P3', 'David', 'M', '35'),
    ('P4', 'Xavier', 'M', '40'),
    ('P5', 'Marie', 'F', '18'),
    ('P6', 'Remy', 'M', '16');
    ***************************************

    -
    Edité par Q_3 18 octobre 2021 à 23:41:17

    • Partager sur Facebook
    • Partager sur Twitter
      18 octobre 2021 à 13:51:45

      Bonjour,

      Q_3 a écrit:

      Quelles sont les personnes qui ont envoyé un message à une femme et qui ont reçu un message d’un homme ?

      MySQL ne disposant pas du mot-clé INTERSECT qui serait ici la meilleure réponse, il faut "tricher" en utilisant une sous-requête :

      Dans la requête principale on liste les personnes qui ont envoyé un message à une femme, et on met une clause WHERE pour qu'il soit dans la liste des personne ayant reçu un message d'un homme ...

      SELECT DISTINCT E.*
      FROM
      	Message M -- les messages
      		INNER JOIN Personne E -- leur expéditeur
      			ON M.Expediteur = E.SSN
      		INNER JOIN Destinataires MP -- leurs destinataires
      			ON M.ID_Message = MP.ID_Message
      		INNER JOIN Personne D -- les destinataires
      			ON MP.Destinataire = D.SSN
      WHERE
      	D.Sexe = 'F' -- le destinataire est une femme
      	AND E.SSN IN (
      		-- Destinataires messages hommes
      		SELECT DISTINCT D.*
      		FROM
      			Message M -- les messages
      				INNER JOIN Personne E -- leur expéditeur
      					ON M.Expediteur = E.SSN
      				INNER JOIN Destinataires MP -- leurs destinataires
      					ON M.ID_Message = MP.ID_Message
      				INNER JOIN Personne D -- les destinataires
      					ON M.Expediteur = E.SSN
      		WHERE E.Sexe = 'H'
      	)

      Q_3 a écrit:

      j'ai trouver une réponse

      Ta réponse ne fonctionne pas puisque tu listes les messages manuellement dans la clause WHERE ... si de nouveau messages et personnes sont insérés en base ton résultat ne seras plus bon ...

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        18 octobre 2021 à 16:45:01

        Bonjour,

        Tout d'abord je remercie pour ton temps et réponse.

        Je ne savais pas que l'on pouvait faire une double jointure en utilisant 2 fois la même table comme tu as fais avec la table personne et ensuite poser ta condition. Pour réussir j'avais besoin de cette jointure et pourtant dans OPENCLASSROOM ou nul part ailleurs on peut voir ça.

        Bien à vous 

        • Partager sur Facebook
        • Partager sur Twitter
          18 octobre 2021 à 17:44:31

          Q_3 a écrit:

          Je ne savais pas que l'on pouvait faire une double jointure en utilisant 2 fois la même table

          Oui, il faut utiliser des alias (noms de remplacement) pour éviter les ambiguïtés.

          Q_3 a écrit:

          dans OPENCLASSROOM ou nul part ailleurs on peut voir ça

          Euh si : https://openclassrooms.com/fr/courses/1959476-administrez-vos-bases-de-donnees-avec-mysql/1963612-jointures#/id/r-1981238

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            18 octobre 2021 à 18:15:05

            J'ai difficile à comprendre la partie avec personne E et personne D j'ai compris les ALIAS mais pourquoi tu refais une jointure de personne D ? En sachant qu'il est déjà joint à la table message ?

            FROM
            Message M -- les messages
            INNER JOIN Personne E -- leur expéditeur
            ON M.Expediteur = E.SSN
            INNER JOIN Destinataires MP -- leurs destinataires
            ON M.ID_Message = MP.ID_Message
            INNER JOIN Personne D -- les destinataires
            ON MP.Destinataire = D.SSN
            • Partager sur Facebook
            • Partager sur Twitter
              18 octobre 2021 à 18:49:20

              Il y a la table personne que j'ai aliasée E (pour Expéditeur) et la table personne que j'ai aliasée D (pour Destinataire).

              La jointure ne se fait pas sur la même colonne. Pour la première c'est sur la colonne Message.Expediteur, pour la deuxième c'est sur la colonne Destinataires.Destinataire.

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                18 octobre 2021 à 22:30:03

                Je tiens à dire que je ne regarderais pas en détail la première réponse de Benzouye. Je dois trouver comment écrire la requête. Pour le moment, je n'ai toujours pas trouvé. J'ai pensé aux jointures "répétées" et j'ai eu l'erreur sql comme quoi il fallait un alias (résultat de recherche obtenu sur SO).

                En revanche, je vais étudier le lien sur la partie du cours qu'a envoyé Benzouye.

                super exo, certes, j'aurais mis une table de relation Destiner comme nom au lieu de Destinataire, mais, la BDD est bien conçue.

                Benzouye, penses-tu que faire les cheminements (je compte découper la grosse requête en plusieurs mini : diviser pour mieux régner) sur papier avec une mini BDD va m'aider à trouver la réponse à la requête principale ?

                • Partager sur Facebook
                • Partager sur Twitter
                  18 octobre 2021 à 23:29:57

                  La première partie est correcte je l'ai manier un peu a ma manière  : 

                  SELECT  P.SSN, P.Nom, M.ID_Message, M.Expediteur, D.Destinataire FROM personne AS P 
                  
                  INNER JOIN message AS M ON P.SSN = M.Expediteur
                  
                  INNER JOIN destinataires AS D ON D.ID_Message = M.ID_Message
                  
                  INNER JOIN personne AS PP ON PP.SSN = D.Destinataire
                  
                  WHERE PP.Sexe = 'F' 

                  Par contre la 2eme partie  : 

                  SELECT  P.SSN id,P.Nom nom,M.ID_Message,M.Expediteur,D.Destinataire FROM personne AS P 
                  
                  INNER JOIN message AS M ON P.SSN = M.Expediteur
                  
                  INNER JOIN destinataires AS D ON D.ID_Message = M.ID_Message
                  
                  INNER JOIN personne AS PP ON PP.SSN = D.Destinataire
                  
                  WHERE PP.Sexe = 'F' 
                  
                  AND P.SSN IN (SELECT p.SSN FROM personne as P
                  
                  INNER JOIN message AS M ON P.SSN = M.Expediteur
                  
                  INNER JOIN destinataires AS D ON D.ID_Message = M.ID_Message
                  
                  INNER JOIN personne AS PPP ON PPP.SSN = M.Expediteur
                  
                  WHERE PPP.Sexe = 'M')

                  Cela retourne la même réponse que le premier la deuxième partie n'est pas pris en compte après le AND. Si je retire le AND et je le remplace par OR alors la réponse deviens :

                  La réponse devrait être  : P1,P1,P1,P4,P4,P4,P6,P6 il manque en gros 1 fois P4 et P6

                  -
                  Edité par Q_3 18 octobre 2021 à 23:39:34

                  • Partager sur Facebook
                  • Partager sur Twitter
                    19 octobre 2021 à 13:51:50

                    Q_3 a écrit:

                    La réponse devrait être  : P1,P1,P1,P4,P4,P4,P6,P6 il manque en gros 1 fois P4 et P6

                    Tu remarqueras que j'avais mis des DISTINCT dans ma proposition car ta demande initiale était "simplement" :

                    Q_3 a écrit:

                    Quelles sont les personnes qui ont envoyé un message à une femme et qui ont reçu un message d’un homme ?

                    Ce à quoi répond ma proposition ... Elle ne retourne que les personnes, sans "détails" ...

                    Toi tu rajoutes des données concernant les messages et les destinataires ... il est évident que ma requête ne le peux pas ...

                    Essayes de reformuler en français ce que tu souhaites exactement.

                    @CR7, je ne comprends pas ton intervention et ta question ?

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                      19 octobre 2021 à 14:28:42

                      Benzouye a écrit:

                      Q_3 a écrit:

                      La réponse devrait être  : P1,P1,P1,P4,P4,P4,P6,P6 il manque en gros 1 fois P4 et P6

                      Tu remarqueras que j'avais mis des DISTINCT dans ma proposition car ta demande initiale était "simplement" :

                      Q_3 a écrit:

                      Quelles sont les personnes qui ont envoyé un message à une femme et qui ont reçu un message d’un homme ?

                      Ce à quoi répond ma proposition ... Elle ne retourne que les personnes, sans "détails" ...

                      Toi tu rajoutes des données concernant les messages et les destinataires ... il est évident que ma requête ne le peux pas ...

                      Essayes de reformuler en français ce que tu souhaites exactement.

                      @CR7, je ne comprends pas ton intervention et ta question ?


                      Tu as totalement raison la question tu as bon, cependant le AND n'est pas correct je pense que ça devrait être OR et ensuite une sous requete
                      • Partager sur Facebook
                      • Partager sur Twitter
                        19 octobre 2021 à 14:41:03

                        Q_3 a écrit:

                        le AND n'est pas correct je pense que ça devrait être OR et ensuite une sous requete

                        Non, le AND est à propos, tu demandes les personnes qui ont envoyé un message à une femme ET qui ont reçu un message d'un homme. C'est un ET, pas un OU ...

                        Benzouye avait écrit plus haut :

                        Essayes de reformuler en français ce que tu souhaites exactement

                        -
                        Edité par Benzouye 19 octobre 2021 à 14:41:54

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

                        MYSQL

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown