Le forum de la communauté PHP !
Vous n'êtes pas identifié.
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
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