Partage
  • Partager sur Facebook
  • Partager sur Twitter

Sous requêtes ou jointure ?

Problème : Les résultats voulus ne sont pas bons

    8 janvier 2019 à 16:33:18

    Bonjour,

    En français ma requête voulu est simple : Je souhaite avoir la liste de personne d'une même famille.

    Mes 2 tables : 

    adherents (ID_adherent, nom, prenom)

    adhesion (ID_adhesion, ID_adherent, ID_ChefFamille, annee)

    Mes 2 champs ID_adherent ( adherents et adhesion) sont joignable,

    L'ID_ChefFamille reprend l'ID_adherent du chef de famille 

    ... Ma question Comment récupérer l'ensemble de la famille avec commeID de départ un simple ID_adherent ?

    Je tourne autour du pot et impossible d'avoir les membre de la famille.

    Voici ma dernière requête 

    $rep_ChefFamille = $bdd_SAE->prepare('
    SELECT adherents.*
    FROM adherents
         JOIN adhesion 
         ON adherents.ID_adherent=adhesion.ID_adherent 
         AND adhesion.ID_adherent=:ID_Famille 
         AND adhesion.annee=:saison'
    );
    
                    
    $rep_ChefFamille->bindValue(':ID_Famille', $_SESSION['SAE_ID_membre'], PDO::PARAM_INT);
    $rep_ChefFamille->bindValue(':saison', $saison, PDO::PARAM_INT);
    $rep_ChefFamille->execute();

    Merci de votre coup de pouce !

    • Partager sur Facebook
    • Partager sur Twitter
      8 janvier 2019 à 17:30:39

      Bonjour,

      Pas testé mais que donnerait ceci ? :

      SELECT adherents.*
      FROM adherents
           JOIN adhesion
           ON adherents.ID_adherent=adhesion.ID_adherent 
      	 WHERE  ID_ChefFamille= (SELECT ID_ChefFamille
      FROM adhes
      WHERE adhesion.ID_adherent=:ID_Famille) AND adhesion.annee=:saison' 
         
      



      • Partager sur Facebook
      • Partager sur Twitter
        8 janvier 2019 à 17:42:39

        Bonjour,

        Avec ce modèle, et si j'ai bien compris, ce devrait être avec ID_CehfFamille :

        SELECT R.*
        FROM
        	adhesion S
        		INNER JOIN adherents R
        			ON S.ID_adherent = R.ID_adherent
        WHERE
        	S.ID_ChefFamille = :ID_Famille
        	AND S.annee = :saison

        Mais je pense que le modèle est mal conçu ... l'information chef de famille est mal positionnée ... C'est un attribut de l'adhérent, pas de l'adhésion ...

        Pour moi le modèle devrait être :

        • adherent ( id_adherent [pk], id_chef [fk], nom, prenom )
        • adhesion ( id_adhesion [pk], id_adherent [fk], annee )

        id_chef référençant id_adherent, et valant NULL pour le chef de famille lui-même ...

        -
        Edité par Benzouye 8 janvier 2019 à 17:42:53

        • Partager sur Facebook
        • Partager sur Twitter
        Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
          9 janvier 2019 à 17:35:18

          Salut, 

          Je viens de faire le tour de vos 2 propositions.

          - Celle de  philodick, me retourne une erreur  :

          #1242 - Subquery returns more than 1 row

          car il y a plusieurs réponses d'après ce que je comprends, et effectivement c'est vrai.

          Est ce que le retour doit être 0 ou 1 ? moi je veux la liste des personnes de la même famille ... Comment suprimmer cette erreur ?

          - Pour celle de Benzoue :

          La requête est OK si l'adhérent qui s'identifie est le chef de famille, si c'est un autre membre il a un retour nul. 

          Pour changer mes tables, ça se discute ... car chaque saison est différente et les adhérents peuvent d''une année sur l'autre s'inscrire en famille ou non, du coup je l'avais mis sur la table adhesion.

          si j'ai trouvé avec ça :

          SELECT adherents.*
          FROM adherents
          JOIN adhesion
          ON adherents.ID_adherent=adhesion.ID_adherent
          WHERE  ID_ChefFamille IN (SELECT ID_ChefFamille FROM adhesion WHERE adhesion.ID_adherent=:ID_Famille) AND adhesion.annee=:saison



          -
          Edité par Marie FRO 9 janvier 2019 à 17:44:33

          • Partager sur Facebook
          • Partager sur Twitter
            9 janvier 2019 à 17:59:38

            Marie FRO a écrit:

            si c'est un autre membre il a un retour nul

            Et oui ...

            Marie FRO a écrit:

            j'ai trouvé avec ça

            Plus joli avec une jointure qu'avec un IN et une sous requête :

            SELECT R.*
            FROM
                adhesion A
            		INNER JOIN adhesion CF
            			ON A.ID_ChefFamille = CF.ID_ChefFamille
                    INNER JOIN adherents R
                        ON CF.ID_adherent = R.ID_adherent
            WHERE
                A.ID_adherent = :ID_Famille
                AND A.annee = :saison

            Attention cela implique que pour l'adhésion du chef de famille ID_adherent et ID_ChefFamille soit renseignés et égaux ...

            Je maintien que le modèle n'est pas glop ... si c'est une question de saison autant matérialiser ces saisons et également les familles / saison ... mais c'est une autre histoire au final :p

            -
            Edité par Benzouye 9 janvier 2019 à 18:04:29

            • Partager sur Facebook
            • Partager sur Twitter
            Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
              9 janvier 2019 à 18:48:40

              J'ai un peu du mal à me représenter tes tables. Comment tu peux avoir plusieurs fois le même ID_adherent ?
              • Partager sur Facebook
              • Partager sur Twitter
                10 janvier 2019 à 9:11:12

                philodick a écrit:

                Comment tu peux avoir plusieurs fois le même ID_adherent ?

                Sur plusieurs années je suppose ...

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

                  Moi ce que je pige pas c'est : 

                  Si tu ne veux que les membres de la famille à partir d'un id_adherent, à quoi sert la saison ? C'est pas comme si la famille allait changé d'une saison à une autre quoi non ?

                  • Partager sur Facebook
                  • Partager sur Twitter
                    10 janvier 2019 à 10:34:16

                    Marie FRO a écrit:

                    chaque saison est différente et les adhérents peuvent d''une année sur l'autre s'inscrire en famille ou non

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

                    Sous requêtes ou 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