Problemes doublons jointures avec WHERE

Résolu
Bonjour à tous et à toutes,

Je suis débutant en PHP et j'ai actuellement un petit probleme.

Je fais actuellement un programme qui me permet de créer un tableau d'élève avec toutes ses caractéristiques y compris les enseignants qu'il a eu depuis qu'il a été inscrit dans l'école.

Je ne mettrais pas tout le programme, qui est très long à lire, je vais juste écrire la requête SQL:

$sql = 'SELECT E.E_MATR, E_NOM, E_PREN, E_SEXE, E_DATNAISS, E_LIEUNAIS, E_PERPREN, E_PERNOM, E_MERPREN, E_MERNOM, SCO_ANN, SCO_PROF ,E_INSCRIPT

FROM tab_asm_elv E, tab_scolar S

WHERE E.E_MATR=S.E_MATR

GROUP BY E_MATR

ORDER BY E_MATR ';

Problème: cette requête ne me permet de n'afficher que un seul enseignant par élève
alors que comme je l'ai dit plus haut, un élève a plusieurs enseignants.

J'aimerais savoir comment faire pour pouvoir,sans doublons, avoir les caractéristiques d'un élève ainsi que tous les enseignants qu'il a eu dans son cursus.

Merci beaucoup pour vos conseils.

13 réponses

  1. Merci de ta réponse jeremy

    J'ai créé deux tables:

    la table tab_asm_elv qui a pour composants:

    E_MATR, E_NOM, E_PREN, E_SEXE, E_DATNAISS, E_LIEUNAIS, E_PERPREN, E_PERNOM, E_MERPREN, E_MERNOM, E_INSCRIPT

    ET une table tab_scolar avec pour composants:

    E_MATR, SCO_PROF, SCO_ANN

    Pour exemple le programme affiche:

    Aléxis
    RETOUR
    M
    xx/xx/xxxx,
    xxx
    prenompere
    nompere
    prenommere
    nommere
    enseignant
    1. Elle représente les enseignants affiliés à un élève
      Elève représenté ici par son matricule pour pouvoir faire la jointure avec la table tab_asm_elv

      Et je n'ai pas créé les tables mais je l'ai est importée
      1. Ok donc à priori ta requete devrait foncitonner ...

        $sql = 'SELECT E.E_MATR, E.E_NOM, E.E_PREN, E.E_SEXE, E.E_DATNAISS, E.E_LIEUNAIS, E.E_PERPREN, E.E_PERNOM, E.E_MERPREN, E.E_MERNOM, S.SCO_ANN, S.SCO_PROF, E.E_INSCRIPT

        FROM tab_asm_elv E, tab_scolar S

        WHERE E.E_MATR=S.E_MATR
        GROUP BY E.E_MATR
        ORDER BY E.E_MATR ';

        1. La requête fonctionne le probleme est qu'elle n'affiche qu'un seul prof pour chaque eleve
          alors que j'aimerais que la requête m'affiche tous les profs d'un eleve
          1. Oui mais la j'ai rajouté des E. et S. devant les champs.

            Sinon essaye sans le group by

            Jérémy
            1. Deja fait
              Cela crée des doublons

              exemple:

              alexis retour prof: eric
              alexis retour prof: jeremy
              1. Normal, mais tu n'arriveras pas faire ce que tu souhaites en une requete à mon avis ...

                $sql = 'SELECT E.E_MATR, E.E_NOM, E.E_PREN, E.E_SEXE, E.E_DATNAISS, E.E_LIEUNAIS, E.E_PERPREN, E.E_PERNOM, E.E_MERPREN, E.E_MERNOM, E.E_INSCRIPT, S.SCO_ANN, S.SCO_PROF

                FROM tab_asm_elv E, tab_scolar S

                WHERE E.E_MATR=S.E_MATR
                GROUP BY E.E_MATR, E.E_NOM, E.E_PREN, E.E_SEXE, E.E_DATNAISS, E.E_LIEUNAIS, E.E_PERPREN, E.E_PERNOM, E.E_MERPREN, E.E_MERNOM, E.E_INSCRIPT
                ORDER BY E.E_MATR ';

                1. Désolé d'avoir autant tarder à répondre.

                  C'est justement là le problème, je ne vois pas comment faire pour obtenir ce que je veux.
                  1. Modérateur
                    GROUP BY E_MATR

                    Problème: cette requête ne me permet de n'afficher que un seul enseignant par élève

                    en même temps, c'est le role du group by...
                    il ne faut pas confondre group by et ordre by
                    ici on veut juste faire un order by pour 'regrouper' l'affichage.

                    la requette est extrêmement simple:

                    select eleve.nom, prof.nom
                    from prof, eleve
                    where prof.id=eleve.id_prof

                    (pour du 1,inf.
                    Si jamais on veut du 0,inf (un éleve oublié qui n'a aucun prof, ou un prof faignant qui n'a aucun eleve, il faudra utiliser un outer join)
                    Stop failing the turing test !
                    1. Bonjour et merci de ta réponse dna.factory

                      Je connais la différence entre le GROUP BY et le ORDER BY

                      Le problème quand je fais ma requête avec le ORDER BY (et ce qui est logique)

                      j'obtiens ce tableau

                      10 Aléxis RETOUR G 1992-01-30 Le Blanc-Mesnil TRUTIE Annick

                      10 Aléxis RETOUR G 1992-01-30 Le Blanc-Mesnil CUZIN Mich

                      10 Aléxis RETOUR G 1992-01-30 Le Blanc-Mesnil TRUTIE Annick

                      10 Aléxis RETOUR G 1992-01-30 Le Blanc-Mesnil TRUTIE Annick

                      et moi je veux que sa affiche

                      10 Aléxis RETOUR G 1992-01-30 Le Blanc-Mesnil

                      et que quand je cliques sur "Aléxis"

                      Je voudrais que sa affiche

                      Aléxis
                      RETOUR
                      G
                      1992-01-30
                      Le Blanc-Mesnil

                      TRUTIE Annick
                      CUZIN Mich
                      TRUTIE Annick
                      TRUTIE Annick
                      1. Modérateur
                        Ok, mais ce n'est pas à la requête de faire ça, c'est à ton programme

                        tu fais une première requête

                        select nom from eleve

                        pour générer ton affichage.
                        et quand tu cliques sur eleve, tu appelle une autre requête qui fera

                        select professeur.nom
                        from professeur, eleve
                        where eleve.id=prof.id_eleve (j'avais inversé dans l'autre)
                        and eleve.nom=$Nom_eleve
                    2. Excusez moi pour ce retard, j'ai enfin trouvé la requête a faire pour pouvoir afficher tous les professeurs d'un seul élève.

                      Dans un premier temps je crée cette requête:

                      $sql = 'SELECT E.E_MATR, E_NOM, E_PREN, E_SEXE, E_DATNAISS, E_LIEUNAIS, E_PERPREN, E_PERNOM, E_MERPREN, E_MERNOM, SCO_ANN, SCO_PROF ,E_INSCRIPT FROM tab_asm_elv E, tab_scolar S WHERE E.E_MATR=S.E_MATR GROUP BY E_MATR ORDER BY E_NOM';

                      Ensuite quand je clique sur le nom j'appelle cette reqûete:

                      $sql2 = 'SELECT S.SCO_PROF, S.SCO_ANN FROM tab_asm_elv E, tab_scolar S WHERE E.E_MATR="'.$matricule.'" AND E.E_MATR=S.E_MATR ORDER BY SCO_ANN';

                      Et sa fonctionne.
                      Merci pour votre aide
                      1. Salut !

                        Peux tu mettre la strucure de tes tables stp :)

                        Mais a première vue ce n'est pas posible avec tes tables actuelles.

                        Quand tu dis "un élève a plusieurs prof" cela se traduit par une table intermédiaire entre la table prof et la table élève.