ManuelPHP.com

Le forum de la communauté PHP !

Vous n'êtes pas identifié.

#1 24-06-2006 17:35:00

JFGD
Membre
Date d'inscription: 24-06-2006
Messages: 2

LEFT JOIN avec filtre sur la table de droite

Je gère des élèves avec 4 tables :
1. apprenants qui contient, entre autres, classeID et utilisateurID
2. Log dont l'ID=utilisateursID
3. notations qui contiernt une "foreign Key" FKapprenant=apprenants.ID   notations contient le mois et l'année de notation par les champs notations.mois et notations.annee
4. classe qui contient classe.id et classe.nom

Je veux connaittre les apprenants d'une classe, d'un certain mois et d'une certaine année qui n'ont pas reçu de notes. Donc

SELECT apprenants FROM notations ON apprenants.ID=notations.FKapprenants
WHERE classeID=$_POST['classe'] AND notations.mois=$_POST['mois'] AND notations.annee=$_POST['annee']

Les variables $_POST qui servent de filtres sont sélectionnées dans une page précédente. Je n'obtiens pas les élèves sans notes mais seulement ceux qui en ont déjà une.
Si je supprime le filtrage sur mois et année qui se trouvent dans la table de droite, j'obtiens tous les élèves pour tous les mois. C'est une caractèristique de LEFT JOIN.
Comment contourner ça ?

J'ai essayé de faire une première requête simple "Selectmoisannee" sur notations en filtrant mois et annee. Je voudrais faire une requête LEFT JOIN entre la table apprenant et la requête "Selectmoisannee". Je n'y arrive pas.

Quelqu'un peut-il me faire avancer ?

Merci

Hors ligne

 

#2 29-06-2006 14:33:42

didier19
Membre
Lieu: strasbourg
Date d'inscription: 28-06-2006
Messages: 54
Site web

Re: LEFT JOIN avec filtre sur la table de droite

il faudrait que tu donnes la structure des 4 tables en question

Hors ligne

 

#3 29-06-2006 15:54:22

JFGD
Membre
Date d'inscription: 24-06-2006
Messages: 2

Re: LEFT JOIN avec filtre sur la table de droite

Voici la requête rsSelectResultat.
A gauche une table "apprenants" qui contient l'identité des élèves et l'identifiant de la classe "classeID"
A droite une table résultats qui contient FKapprenant=apprenants.ID, le mois et l'année des notes attribuées, s'il y en a et la note
Je cherche l'ID des élèves qui n'ont pas encore reçu de note une année donnée et un mois donné, c-à-d quand mois et année sont NULL.

Dans la table de gauche, je sélectionne une classe
$colclasse_rsSelectResultat = "1";
if (isset($_POST['classe'])) {
  $colclasse_rsSelectResultat = (get_magic_quotes_gpc()) ? $_POST['classe'] : addslashes($_POST['classe']);
}

Dans la table de droite le mois, peut être null
$colmois_rsSelectResultat = "1";
if (isset($_row_rscomptenotes['mois'])) {
  $colmois_rsSelectResultat = (get_magic_quotes_gpc()) ? $_row_rscomptenotes['mois'] : addslashes($_row_rscomptenotes['mois']);
}

Dans la table de droite l'année, peut-être NULL
$colclasse_rsSelectResultat = "1";
if (isset($_POST['classe'])) {
  $colclasse_rsSelectResultat = (get_magic_quotes_gpc()) ? $_POST['classe'] : addslashes($_POST['classe']);
}

La table classe sert à donner le nom de la classe à partir de son N°, par ex.  6 : sixième, 5 : cinquième, etc .... ne joue aucun rolé dans le pb
La table log contient login et psw des élèves, n'intervient pas dans cette requête

mysql_select_db($database_ConnexionEDUC, $ConnexionEDUC);
$query_rsSelectResultat = sprintf("SELECT DISTINCT apprenants.nom, apprenants.ID, classe.Classe, apprenants.prenom, resultats.FKapprenants, resultats.mois, resultats.annee,resultats.resultats FROM apprenants LEFT JOIN resultats ON  apprenants.ID=resultats.FKapprenants , classe WHERE classe.ID=%s AND apprenants.classeID >0 AND resultats.mois=%s AND classe.ID=apprenants.classeID AND resultats.annee=%s AND  apprenants.ID=%s ORDER BY nom,prenom", $colclasse_rsSelectResultat,$colmois_rsSelectResultat,$colannee_rsSelectResultat,$colFK_rsSelectResultat);
$query_limit_rsSelectResultat = sprintf("%s LIMIT %d, %d", $query_rsSelectResultat, $startRow_rsSelectResultat, $maxRows_rsSelectResultat);
$rsSelectResultat = mysql_query($query_limit_rsSelectResultat, $ConnexionEDUC) or die(mysql_error());
$row_rsSelectResultat = mysql_fetch_assoc($rsSelectResultat);

Voilà. Si je ne trie pas mois et année, j'ai bient tous mes élèves. Si je trie, n'apparaissent que les élèves qui ont déjà été notés.

Merci

Une erreur dans la prédente requête, il n'y a pas de filtrage sur les élèves donc voici la vraie requête

$query_rsSelectResultat = sprintf("SELECT DISTINCT apprenants.nom, apprenants.ID, classe.Classe, apprenants.prenom, resultats.FKapprenants, resultats.mois, resultats.annee,resultats.resultats FROM apprenants LEFT JOIN resultats ON  apprenants.ID=resultats.FKapprenants , classe WHERE classe.ID=%s AND apprenants.classeID >0 AND resultats.mois=%s AND classe.ID=apprenants.classeID AND resultats.annee=%s ORDER BY nom,prenom", $colclasse_rsSelectResultat,$colmois_rsSelectResultat,$colannee_rsSelectResultat);

Désolé

Dernière modification par JFGD (29-06-2006 16:10:34)

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr