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
    0
    1. La table scloar représente les prof ?
      0
      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
        0
        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 ';

          0
          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
            0
            1. Oui mais la j'ai rajouté des E. et S. devant les champs.

              Sinon essaye sans le group by

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

                exemple:

                alexis retour prof: eric
                alexis retour prof: jeremy
                0
                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 ';

                  0
                  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.
                    0
                    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 !
                      0
                      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
                        0
                        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
                          0
                        2. +1
                          0
                      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
                        0
                        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.
                          -1