Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme double jointure

    13 septembre 2019 à 17:09:40

    Bonjour, je bloque sur un problème qui doit être tout bête, car j'ai deux requête qui fonctionnent parfaitement l'une après l'autre mais des  que je les 'lient' ça me renvoit un mauvais résultat. (le résultat renvoyé sur mes colonnes nb_article et  nombre_commentaire, est le résultat multiplié par deux de la colonne nombre_commentaire) 

    La base de donnée se trouve ici : http://exercices.openclassrooms.com/assessment/223?id=1959476&slug=administrez-vos-bases-de-donnees-avec-mysql&login=7768139&tk=b158f7260d792e119265d4d0c8575840&sbd=2016-02-01&sbdtk=2466d6bae51e373d89ac8e3f74213199

    # Mes deux requêtes qui marchent 
    
    SELECT Utilisateur.id, COUNT(Commentaire.auteur_id) AS nombre_commentaire, MAX(Commentaire.date_commentaire) AS date_dernier_commentaire
    FROM Utilisateur
    LEFT JOIN Commentaire ON Utilisateur.id = Commentaire.auteur_id
    GROUP BY Utilisateur.id;
    
    SELECT Utilisateur.id, COUNT(Article.auteur_id) AS nb_article, MAX(date_publication) AS date_dernier_article
    FROM Utilisateur
    LEFT JOIN Article ON Utilisateur.id = Article.auteur_id
    GROUP BY Utilisateur.id;
    
    
    # Ma requête qui ne marche pas 
    
    SELECT Utilisateur.id, COUNT(Article.auteur_id) AS nb_article, MAX(date_publication) AS date_dernier_article
    SELECT COUNT(Commentaire.id) AS nombre_commentaire, MAX(Commentaire.date_commentaire) AS date_dernier_commentaire
    FROM Utilisateur
    LEFT JOIN Article ON Utilisateur.id = Article.auteur_id
    LEFT JOIN Commentaire ON Utilisateur.id = Commentaire.auteur_id
    GROUP BY id;



    • Partager sur Facebook
    • Partager sur Twitter
      14 septembre 2019 à 14:59:19

      Bonjour,

      Qu'est-ce que tu appelles "un mauvais résultat" ? Tu fais des jointures externes, ce n'est peut-être pas ce que tu attends, mais c'est sans doute ce que tu demandes.

      • Partager sur Facebook
      • Partager sur Twitter
        14 septembre 2019 à 16:31:12

        Tout d'abord merci pour ta réponse.

        Si j'utilise LEFT JOIN c'est parce que je veux garder toutes les données de la colonne id 

        # Et ça me retourne un mauvais résultat parce que, quand je fais mes deux requêtes séparées ça me donne ce résultat : 
        
        PREMIERE REQUETE : 
        
         SELECT Utilisateur.id, COUNT(Commentaire.auteur_id) AS nombre_commentaire, MAX(Commentaire.date_commentaire) AS date_dernier_commentaire
            -> FROM Utilisateur
            -> LEFT JOIN Commentaire ON Utilisateur.id = Commentaire.auteur_id
            -> GROUP BY Utilisateur.id;
        +----+--------------------+--------------------------+
        | id | nombre_commentaire | date_dernier_commentaire |
        +----+--------------------+--------------------------+
        |  1 |                  3 | 2014-11-23 07:44:33      |
        |  2 |                  2 | 2014-11-24 08:47:15      |
        |  3 |                  0 | NULL                     |
        |  4 |                  1 | 2014-11-10 05:06:47      |
        +----+--------------------+--------------------------+
        
        
        DEUXIEME REQUETE : 
        
        SELECT Utilisateur.id, COUNT(Article.auteur_id) AS nb_article, MAX(date_publication) AS date_dernier_article
            -> FROM Utilisateur
            -> LEFT JOIN Article ON Utilisateur.id = Article.auteur_id
            -> GROUP BY Utilisateur.id;
        +----+------------+----------------------+
        | id | nb_article | date_dernier_article |
        +----+------------+----------------------+
        |  1 |          2 | 2014-10-24 16:38:23  |
        |  2 |          2 | 2014-10-28 07:50:25  |
        |  3 |          2 | 2014-10-30 22:25:30  |
        |  4 |          2 | 2014-10-11 16:50:17  |
        
        
        Mes deux requêtes en une seule : 
        
        SELECT Utilisateur.id, COUNT(Article.auteur_id) AS nb_article, MAX(date_publication) AS date_dernier_article,
            -> COUNT(Commentaire.id) AS nombre_commentaire, MAX(Commentaire.date_commentaire) AS date_dernier_commentaire
            -> FROM Utilisateur
            -> LEFT JOIN Article ON Utilisateur.id = Article.auteur_id
            -> LEFT JOIN Commentaire ON Utilisateur.id = Commentaire.auteur_id
            -> GROUP BY id;
        +----+------------+----------------------+--------------------+--------------------------+
        | id | nb_article | date_dernier_article | nombre_commentaire | date_dernier_commentaire |
        +----+------------+----------------------+--------------------+--------------------------+
        |  1 |          6 | 2014-10-24 16:38:23  |                  6 | 2014-11-23 07:44:33      |
        |  2 |          4 | 2014-10-28 07:50:25  |                  4 | 2014-11-24 08:47:15      |
        |  3 |          2 | 2014-10-30 22:25:30  |                  0 | NULL                     |
        |  4 |          2 | 2014-10-11 16:50:17  |                  2 | 2014-11-10 05:06:47      |
        +----+------------+----------------------+--------------------+--------------------------+

        Je sais que l'erreur se trouve au niveau de mes jointures (j'ai découpé plusieurs fois ma commande pour savoir ou ça buggais, mais impossible de savoir pourquoi ...)

        • Partager sur Facebook
        • Partager sur Twitter
          15 septembre 2019 à 12:30:34

          Bonjour,

          Le problème vient des cardinalités... ce n'est pas un bug.

          Un utilisateur pouvant avoir à la fois plusieurs articles ET plusieurs commentaires, ta requête retourne tous les couples article/commentaire possible...

          Un utilisateur ayant 2 articles et 3 commentaires retournera 6 lignes...

          Pour comprendre retire les COUNT et le GROUP BY, et laisse article_id et commmentaire_id et regarde le résultat. 

          Ici il n'y a pas d'autre solution que de faire deux requêtes ou au moins deux sous-requetes (ou deux vues)...

          -
          Edité par Benzouye 15 septembre 2019 à 12:32:41

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

          Probleme double jointure

          × 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