Comment réaliser le classement des moyenne dans une classe [Résolu]

Signaler
Messages postés
498
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
1 mars 2020
-
Messages postés
498
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
1 mars 2020
-
Bonjour,
je voudrais réaliser les classement des élèves d'une classe dans une matière précise connaissant les notes obtenues par ses élèves dans la classe.

je me suis inspiré d'un exemple de requête que j'ai eu sur un site mais j'arrive pas :

voici la requête en question :
SELECT a1.Name, a1.Sales, COUNT(a2.sales) Sales_Rank
FROM Total_Sales a1, Total_Sales a2
WHERE a1.Sales <= a2.Sales OR (a1.Sales = a2.Sales AND a1.Name = a2.Name)
GROUP BY a1.Name, a1.Sales
ORDER BY a1.Sales DESC, a1.Name DESC;




voici ce que j'ai tenté de faire :

<?php
//la function qui va permettre le classement
function classement(){
//if(isset($_GET['id'])) $id = urldecode($_GET['id']);
if(isset($_GET['mat'])) $mat = urldecode($_GET['mat']);
if(isset($_GET['class'])) $class = urldecode($_GET['class']);
$results = array();
$sql = "SELECT E.id_elv
,E.note
,COUNT(N.note) note_Rank
FROM notes E
,notes N
WHERE E.note <= N.note
OR (E.note = N.note AND E.id_elv = N.id_elv)
AND eval = '".$class."'
GROUP BY E.id_elv, E.note
ORDER BY E.note DESC
, E.id_elv DESC";
$query = mysql_query($sql) or die("error");
while($row = mysql_fetch_assoc($query)){
$results[] = $row;
}
return $results;
}

?>


voici la structure de ma table notes :

12 réponses

Messages postés
29806
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
22 octobre 2020
338
Bonjour,

COUNT ne donne que le NOMBRE d'enregistrements dans un CHAMP.

Pour faire une moyenne il te faut faire la SOMME divisée par le NOMBRE
donc... en plus du COUNT...utiliser le SUM

Ensuite....

ENCORE UNE FOIS... tu postes dans question dans la section PHP du forum....alors qu'elle ne concerne qu'un souci de REQUETE !!!!
Je te le redis...il y a une section exprès pour ça : SQL !
=> http://codes-sources.commentcamarche.net/forum/sql-117


Mais bon... voila.;.
Ta requête devrait ressembler à quelque chose du genre :
SELECT N.id_elv
      ,SUM(N.note) as somme_Notes
      ,COUNT(N.note) nb_Notes
      ,SUM(N.note)/COUNT(N.note) as Moyenne
FROM notes N
WHERE   eval = '".$class."'
GROUP BY N.id_elv
ORDER BY Moyenne DESC, N.id_elv DESC




Avant de poser une question, merci de lire la charte du site.
Cordialement, Jordane
Messages postés
498
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
1 mars 2020

mon problème n'est pas résolu . il faut que ce classement soit celui des élèves d'une classe dans une matière .
ensuite je veux récupérer le rang de chaque élève pour l'insérer dans son bulletin
Messages postés
498
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
1 mars 2020

voici ce que j'ai tenté mais je vois pas le rang :
//la function qui va permettre le classement
function classement(){
//if(isset($_GET['id'])) $id = urldecode($_GET['id']);
if(isset($_GET['mat'])) $mat = urldecode($_GET['mat']);
if(isset($_GET['class'])) $class = urldecode($_GET['class']);
$results = array();
$sql = "SELECT N.id_elv
,id_matiere
,SUM(N.note) as somme_Notes
,COUNT(N.note) nb_Notes
,SUM(E.note)/COUNT(N.note) as Moyenne
FROM notes N
WHERE eval = '".$class."'
GROUP BY N.id_elv
ORDER BY Moyenne DESC, N.id_elv DESC
";
$query = mysql_query($sql) or die("error");
while($row = mysql_fetch_assoc($query)){
$results[] = $row;
}
return $results;
}

?>
Messages postés
29806
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
22 octobre 2020
338
Qu'appelles tu le RANG ?
La position dans le classement de l'elève ??
Ben si ce n'est que ça.... c'est l'ordre d'affichage des données provenant de la requête...

Déjà... est que la requête
SELECT N.id_elv
      ,SUM(N.note) as somme_Notes
      ,COUNT(N.note) nb_Notes
      ,SUM(N.note)/COUNT(N.note) as Moyenne
FROM notes N
WHERE   eval = '".$class."'
GROUP BY N.id_elv
ORDER BY Moyenne DESC, N.id_elv DESC

Te donne bien la Moyenne de chaque élève... trié en ordre decroissant ?
Messages postés
498
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
1 mars 2020

oui c'est la Moyenne de chaque élève... trié en ordre decroissant .
Messages postés
29806
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
22 octobre 2020
338
Et pour le RANG ??? tu ne m'as pas répondu !
Messages postés
498
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
1 mars 2020

j'essaie d'afficher en plus de la moyenne les nom , prenom .. mais ça m'affiche error
voici ma requête :
$sql = "SELECT N.id_elv
,N.id_matiere
,SUM(N.note) as somme_Notes
,COUNT(N.note) nb_Notes
,SUM(E.note)/COUNT(N.note) as Moyenne
,I.id_inscri
,I.matricule
,I.nom
,I.prenom
,I.sexe
,I.date_naiss
FROM notes N ,inscription I,matieres M
WHERE eval = '".$class."'
AND M.id = N.id_matiere
AND N.id_elv = I.id_inscri
AND M.matiere = '".$matiere."'
GROUP BY N.id_elv
ORDER BY Moyenne DESC, N.id_elv DESC
";
Messages postés
29806
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
22 octobre 2020
338
En testant </directement dans ta bdd quel message d'erreur EXACTE obtiens tu ?
Messages postés
498
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
1 mars 2020

1. l'erreur c'etait
SUM(E.note)
N et non E.
2. voici ce que j'obtient :


je devrai avoir 1er ; 2ieme ; 3ieme et non les ID
voici la requète :
$sql = "SELECT N.id_elv
,N.id_matiere
,SUM(N.note) as somme_Notes
,COUNT(N.note) nb_Notes
,SUM(N.note)/COUNT(N.note) as Moyenne
,I.id_inscri
,I.matricule
,I.nom
,I.prenom
,I.sexe
,I.date_naiss
FROM notes N ,inscription I,matieres M
WHERE eval = '".$class."'
AND M.id = N.id_matiere
AND N.id_elv = I.id_inscri
AND M.matiere = '".$matiere."'
GROUP BY N.id_elv
ORDER BY Moyenne DESC, N.id_elv DESC
";
Messages postés
29806
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
22 octobre 2020
338
Mais vas tu me dire enfin ce que tu appelles RANG ?????
Messages postés
498
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
1 mars 2020

le classement . classer les élèves du premier au dernier selon la moyenne obtenues
comme ceci :
Messages postés
29806
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
22 octobre 2020
338
Et qyel est le souci ?
Tu as via ta requête les eleves classés xpar leur moyenne...il te suffit, lorsque tu traites tes données via php d'incrementer une variables...
Messages postés
498
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
1 mars 2020

je vois pas comment m'y prendre
Messages postés
29806
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
22 octobre 2020
338
...... comment affiches tu ton tableau sur ta page (quel code) ?
Messages postés
498
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
1 mars 2020

voici la fonction :
<?php
//la function qui va permettre le classement
function classement(){
//http://www.1keydata.com/fr/sql/sql-rang.php
//if(isset($_GET['id'])) $id = urldecode($_GET['id']);
if(isset($_GET['matiere'])) $matiere = urldecode($_GET['matiere']);
if(isset($_GET['class'])) $class = urldecode($_GET['class']);
$results = array();
$sql = "SELECT N.id_elv
,N.id_matiere
,SUM(N.note) as somme_Notes
,COUNT(N.note) nb_Notes
,SUM(N.note)/COUNT(N.note) as Moyenne
,I.id_inscri
,I.matricule
,I.nom
,I.prenom
,I.sexe
,I.date_naiss
FROM notes N ,inscription I,matieres M
WHERE eval = '".$class."'
AND M.id = N.id_matiere
AND N.id_elv = I.id_inscri
AND M.matiere = '".$matiere."'
GROUP BY N.id_elv
ORDER BY Moyenne DESC, N.id_elv DESC
";
$query = mysql_query($sql) or die("error");
while($row = mysql_fetch_assoc($query)){
$results[] = $row;
}
return $results;
}

?>

voici l'affichange :
  <table width="914" border="0" >
<tr style="font-family:Georgia, 'Times New Roman', Times, serif; font-size:14px; background-color:#408080; color:#FFF">
<td width="48" align="center">N°</td>
<td width="114" align="center">MATRICULE</td>
<td width="200" align='left'>NOM</td>
<td width="307" align='left'>PRENOMS</td>
<td width="38" align="center">S</td>
<td width="54" align="center">AGE</td>
<td width="46" align="center">MOY </td>
<td width="73" align="center">RANG</td>
</tr>
<?php
//$elevPrec = "";
$classements = classement();
foreach($classements as $classement){
?>
<tr style="font-family:Georgia, 'Times New Roman', Times, serif; font-size:14px; background-color:#CDCDCD; color:#000">
<td width="73" align="center"><?php echo $classement[""]; ?></td>
<td width="48" align="center"><?php echo $classement["matricule"]; ?></td>
<td width="114" align="center"><?php echo $classement["nom"]; ?></td>
<td width="200" align='left'><?php echo $classement["prenom"]; ?></td>
<td width="307" align='left'><?php echo $classement["sexe"]; ?></td>
<td width="38" align="center"><?php echo $classement["date_naiss"]; ?></td>
<td width="54" align="center"><?php echo $classement["Moyenne"]; ?></td>
<td width="46" align="center"><?php echo $classement["id_elv"]; ?> </td>

</tr>
<?php
}
?>
</table>
Messages postés
29806
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
22 octobre 2020
338

$rang=0;

foreach($classements  as $classement){
$rang++;
?>
    <tr style="font-family:Georgia, 'Times New Roman', Times, serif; font-size:14px; background-color:#CDCDCD; color:#000">
      <td width="73" align="center"><?php  echo $rang; ?></td>
      <td width="48" align="center"><?php echo $classement["matricule"];  ?></td>
      <td width="114" align="center"><?php  echo $classement["nom"]; ?></td>
      <td width="200" align='left'><?php echo $classement["prenom"];  ?></td>
      <td width="307" align='left'><?php  echo $classement["sexe"]; ?></td>
      <td width="38" align="center"><?php  echo $classement["date_naiss"]; ?></td>
      <td width="54" align="center"><?php  echo $classement["Moyenne"]; ?></td>
      <td width="46" align="center"><?php echo $classement["id_elv"];  ?> </td>
      
  </tr>
<?php
}



Messages postés
498
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
1 mars 2020

voici ce ke ça affiche :


mais pourquoi ça me met pas 1;2;3 a la place de 19;20;21 .
Messages postés
29806
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
22 octobre 2020
338
Par ce que...si tu avais regardé le code... tu aurais vu que j'avais mis le rang en première colonne...
Et si ça t'affiche les ID des élèves....ben c'est parce que c'est ce que TU AS ECRIS !!

bref,le voici à la bonne place...

$rang=0;

foreach($classements  as $classement){
$rang++;
?>
    <tr style="font-family:Georgia, 'Times New Roman', Times, serif; font-size:14px; background-color:#CDCDCD; color:#000">
      <td width="73" align="center"></td>
      <td width="48" align="center"><?php echo $classement["matricule"];  ?></td>
      <td width="114" align="center"><?php  echo $classement["nom"]; ?></td>
      <td width="200" align='left'><?php echo $classement["prenom"];  ?></td>
      <td width="307" align='left'><?php  echo $classement["sexe"]; ?></td>
      <td width="38" align="center"><?php  echo $classement["date_naiss"]; ?></td>
      <td width="54" align="center"><?php  echo $classement["Moyenne"]; ?></td>
      <td width="46" align="center"><?php  echo $rang; ?> </td>
      
  </tr>
<?php
}
Messages postés
498
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
1 mars 2020

bonsoir ,
jusque la tout va bien.
je veux le classement sur le bulletin de chaque élève de chaque matière .

voici ce que j'ai tenté de faire mais a m'affiche 19 (id_elv)devant chaque matière .


voici la partie de mon code :
<?php 
//recuperation du groupe
$sql_m0 = ('SELECT groupe
FROM matieres
GROUP BY groupe
');
$q_m0 = mysql_query($sql_m0) or die('Erreur SQL !<br>'.$sql_m0.'<br>'.mysql_error());
$n_m0 = mysql_num_rows($q_m0);
while ($r_m0 = mysql_fetch_assoc($q_m0)) { //echo $r_m0['groupe'];
//recuperation des matières
$sql_m = ('SELECT *
FROM matieres
WHERE groupe = "'.$r_m0['groupe'].'"
');
$q_m = mysql_query($sql_m) or die('Erreur SQL !<br>'.$sql_m.'<br>'.mysql_error());
$n_m = mysql_num_rows($q_m);
while ($r_m = mysql_fetch_assoc($q_m)) {
//partie maoyenne
//echo $r_m['matiere'];
$sql = "SELECT N.id_elv
,N.id_matiere
,SUM(N.note) as somme_Notes
,COUNT(N.note) nb_Notes
,SUM(N.note)/COUNT(N.note) as Moyenne
,I.id_inscri
,I.matricule
,I.nom
,I.prenom
,I.sexe
,I.date_naiss
FROM notes N ,inscription I,matieres M
WHERE eval = '".$class."'
AND M.id = N.id_matiere
AND N.id_elv = I.id_inscri
AND M.matiere = '".$r_m['matiere']."'
AND N.id_elv = '".$id."'
AND (MONTH(N.date_enrg) BETWEEN '".$debut."' AND '".$fin."')
GROUP BY N.id_elv
ORDER BY Moyenne DESC, N.id_elv DESC
";
$query = mysql_query($sql) or die("error");
$rr = mysql_fetch_assoc($query);
//calcul de moyenne
$MOY0 = $rr['Moyenne'];
$MOY = number_format($MOY0, 2, ',', ' ');
//calcul de moyenne avec coefficient
$MOY_COEFF = $MOY * $r_m['coeff'];
//RANG

echo'<tr>
<td>'.$r_m['matiere'].'</td>
<td align="center">'.$MOY.'</td>
<td align="center">'.$r_m['coeff'].'</td>
<td align="center">'.$MOY_COEFF.'</td>
';
?>
<td>
<?php
echo $rr["id_elv"];
?>
</td>
<?php
echo'
<td>'.$rr['pseudo'].'</td>
<td></td>
</tr>
<tr>
';
}
echo ' <tr align="center">
<td colspan="7"><font color="red"><b> Bilan en '.$r_m0['groupe'].'</font></b></td>
</tr>';
}
?>