Partage
  • Partager sur Facebook
  • Partager sur Twitter

Left Join / Right Join avec 3 tables

    29 octobre 2019 à 0:12:19

    Bonsoir, 

    J'ai un petit ennui pour pouvoir lire certaines données de ma base de données. Je vous joins un screen de la structure de ma base de données pour que ce soit le plus explicite possible : 

    J'exécute une requête qui me permet d'afficher les matchs qui n'ont pas encore eu lieu ainsi que différentes informations sur ce match : 

    SELECT
    					E1.logo AS logo_domicile,
    					E1.nom AS domicile,
    					E2.logo AS logo_exterieur,
    					E2.nom AS exterieur,
    					M.id_match As id_match,
    					L.logo_championnat As championnat,
    					DATE_FORMAT(M.date, "%a %e %b <br /> %kh%i") As date, 
    					M.cote_dom AS cote_dom, 
    					M.cote_nul AS cote_nul,
    					M.cote_ext AS cote_ext
    
    					FROM
    					matches M
    					INNER JOIN equipe E1
    					ON M.id_dom = E1.id_equipe
    					INNER JOIN equipe E2
    					ON M.id_ext = E2.id_equipe
    					INNER JOIN championnat L
    					ON M.id_championnat = L.id_championnat
    
    					WHERE
    					M.date > "'.$date.'"
    
    					GROUP BY M.id_match
    
    					ORDER BY M.date ASC, M.id_match ASC

    Cependant, j'aimerais aussi afficher, pour un membre donné, le score qu'il a parié sur ce match. Sauf que les matchs sur lesquels le membre n'a pas parié ne s'affiche pas, malgré l'utilisation d'un Left Join. Peut-être cela vient-il du fait qu'il n'y ait pas de jointure directe entre la table matches et la table pari (qui détermine in fine si le joueur a parié ou non).

    Ma tentative était donc celle-ci : 

    					SELECT
    					E1.logo AS logo_domicile,
    					E1.nom AS domicile,
    					E2.logo AS logo_exterieur,
    					E2.nom AS exterieur,
    					M.id_match As id_match,
    					L.logo_championnat As championnat,
    					DATE_FORMAT(M.date, "%a %e %b <br /> %kh%i") As date, 
    					M.cote_dom AS cote_dom, 
    					M.cote_nul AS cote_nul,
    					M.cote_ext AS cote_ext,
    					S.score_dom AS score_domicile,
    					S.score_ext AS score_exterieur
    
    					FROM
    					matches M
    					INNER JOIN equipe E1
    					ON M.id_dom = E1.id_equipe
    					INNER JOIN equipe E2
    					ON M.id_ext = E2.id_equipe
    					INNER JOIN championnat L
    					ON M.id_championnat = L.id_championnat
    					INNER JOIN cote C 
    					ON M.id_match = C.id_match 
    					INNER JOIN score S 
    					ON C.id_score = S.id_score  
    					LEFT JOIN pari P 
    					ON C.id_cote = P.id_cote


    J'ai également tenté de faire ça en deux requêtes en récupérant l'id_match suite à la première requête et en trouvant le score parié grâce à l'id_match et à l'id_membre via une deuxième requête exécuté lors de la première. Mais là encore, le même problème se pose : seuls les matches sur lesquels le membre a parié s'affichent (alors qu'ils s'affichent tous avec la première requête). 

    Je pense que mon erreur vient d'un problème de manipulation avec les jointures, à moins qu'il y ait une technique particulière pour ce genre de "jointure indirecte" ? 

    Merci beaucoup !

    -
    Edité par SachaAllouche 29 octobre 2019 à 0:30:42

    • Partager sur Facebook
    • Partager sur Twitter
      29 octobre 2019 à 22:13:59

      Ne faus t'il pas de cote e si il a parié ? 

      Si oui Faut aussi  un left avec cote , 

      LeftJOINcote C

      • Partager sur Facebook
      • Partager sur Twitter
        5 novembre 2019 à 11:48:57

        Bonjour, 

        Ca ne fonctionne pas non plus mais pour être un peu plus explicite peut-être : 

        - Il y a une liste de matchs 

        - Chaque match a forcément des cotes 

        - Chaque match n'a pas forcément de pari associé 

        - Je cherche à afficher tous les matchs et leurs cotes, qu'il y ait des paris associés ou non 

        • Partager sur Facebook
        • Partager sur Twitter
          5 novembre 2019 à 12:10:42

          En l'état ta requête (la deuxième) devrait te sortir la liste des matchs lié à un championnat, ayant deux équipes saisies, ayant au moins une cote saisie, cette cote ayant un score saisi, et avec le pari si il existe ...

          Cela me paraît cohérent avec ta demande, du coup peux-tu nous donner un exemple de données qui ne sont pas listées par cette requête et qui devrait l'être ? Il faut que tu remontes ta chaîne de jointures pour voir où cela ne se passe pas comme tu veux ...

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

            Bonjour,

            Tu parles de cette requête ?

            SachaAllouche a écrit:

            J'ai également tenté de faire ça en deux requêtes en récupérant l'id_match suite à la première requête et en trouvant le score parié grâce à l'id_match et à l'id_membre via une deuxième requête exécuté lors de la première. Mais là encore, le même problème se pose : seuls les matches sur lesquels le membre a parié s'affichent (alors qu'ils s'affichent tous avec la première requête).

            -
            Edité par SachaAllouche 29 octobre 2019 à 0:30:42


            Si oui, ça fonctionne finalement après quelques tentatives de bidouillage. Mais donc c'est impossible de le faire en une seule requête ?
            • Partager sur Facebook
            • Partager sur Twitter
              5 novembre 2019 à 17:53:12

              SachaAllouche a écrit:

              Tu parles de cette requête ?

              Je parle de cette requête :

              SachaAllouche a écrit:

              Ma tentative était donc celle-ci : 

              					SELECT
              					E1.logo AS logo_domicile,
              					E1.nom AS domicile,
              					E2.logo AS logo_exterieur,
              					E2.nom AS exterieur,
              					M.id_match As id_match,
              					L.logo_championnat As championnat,
              					DATE_FORMAT(M.date, "%a %e %b <br /> %kh%i") As date, 
              					M.cote_dom AS cote_dom, 
              					M.cote_nul AS cote_nul,
              					M.cote_ext AS cote_ext,
              					S.score_dom AS score_domicile,
              					S.score_ext AS score_exterieur
              
              					FROM
              					matches M
              					INNER JOIN equipe E1
              					ON M.id_dom = E1.id_equipe
              					INNER JOIN equipe E2
              					ON M.id_ext = E2.id_equipe
              					INNER JOIN championnat L
              					ON M.id_championnat = L.id_championnat
              					INNER JOIN cote C 
              					ON M.id_match = C.id_match 
              					INNER JOIN score S 
              					ON C.id_score = S.id_score  
              					LEFT JOIN pari P 
              					ON C.id_cote = P.id_cote

              SachaAllouche a écrit:

              c'est impossible de le faire en une seule requête ?

              De faire quoi ? Cette requête fait ce que tu demandes ... il suffit juste dans le SELECT les infos du pari ... et dans la jointure externe l'id de l'utilisateur connecté (en variable) ...

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                5 novembre 2019 à 19:41:56

                Benzouye a écrit:

                De faire quoi ? Cette requête fait ce que tu demandes ... il suffit juste dans le SELECT les infos du pari ... et dans la jointure externe l'id de l'utilisateur connecté (en variable) ...


                Je pense que c'est ça que je ne maîtrise pas, je mettais l'id de l'utilisateur connecté en condition dans le WHERE ! Si c'est bien ça qui peut poser problème, où est-ce que je peux trouver des informations sur les variables directement dans les jointures ? 

                Merci beaucoup de tes éclaircissements ! 

                • Partager sur Facebook
                • Partager sur Twitter

                Left Join / Right Join avec 3 tables

                × 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