Comment réaliser le classement des moyenne dans une classe

Résolu
msi79 Messages postés 509 Date d'inscription lundi 24 août 2009 Statut Membre Dernière intervention 2 mai 2023 - 9 juil. 2014 à 14:43
msi79 Messages postés 509 Date d'inscription lundi 24 août 2009 Statut Membre Dernière intervention 2 mai 2023 - 11 juil. 2014 à 01:24
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

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 344
Modifié par jordane45 le 9/07/2014 à 18:02
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
0
msi79 Messages postés 509 Date d'inscription lundi 24 août 2009 Statut Membre Dernière intervention 2 mai 2023 1
Modifié par msi79 le 9/07/2014 à 16:36
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
0
msi79 Messages postés 509 Date d'inscription lundi 24 août 2009 Statut Membre Dernière intervention 2 mai 2023 1
9 juil. 2014 à 17:13
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;
}

?>
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 344
9 juil. 2014 à 18:04
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 ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
msi79 Messages postés 509 Date d'inscription lundi 24 août 2009 Statut Membre Dernière intervention 2 mai 2023 1
9 juil. 2014 à 19:25
oui c'est la Moyenne de chaque élève... trié en ordre decroissant .
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 344
9 juil. 2014 à 20:04
Et pour le RANG ??? tu ne m'as pas répondu !
0
msi79 Messages postés 509 Date d'inscription lundi 24 août 2009 Statut Membre Dernière intervention 2 mai 2023 1
9 juil. 2014 à 20:34
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
";
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 344
9 juil. 2014 à 20:45
En testant </directement dans ta bdd quel message d'erreur EXACTE obtiens tu ?
0
msi79 Messages postés 509 Date d'inscription lundi 24 août 2009 Statut Membre Dernière intervention 2 mai 2023 1
9 juil. 2014 à 21:20
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
";
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 344
9 juil. 2014 à 21:24
Mais vas tu me dire enfin ce que tu appelles RANG ?????
0
msi79 Messages postés 509 Date d'inscription lundi 24 août 2009 Statut Membre Dernière intervention 2 mai 2023 1
Modifié par msi79 le 9/07/2014 à 22:01
le classement . classer les élèves du premier au dernier selon la moyenne obtenues
comme ceci :
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 344
9 juil. 2014 à 22:03
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...
0
msi79 Messages postés 509 Date d'inscription lundi 24 août 2009 Statut Membre Dernière intervention 2 mai 2023 1
9 juil. 2014 à 22:21
je vois pas comment m'y prendre
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 344
9 juil. 2014 à 22:41
...... comment affiches tu ton tableau sur ta page (quel code) ?
0
msi79 Messages postés 509 Date d'inscription lundi 24 août 2009 Statut Membre Dernière intervention 2 mai 2023 1
9 juil. 2014 à 22:46
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>
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 344
9 juil. 2014 à 23:38

$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
}



0
msi79 Messages postés 509 Date d'inscription lundi 24 août 2009 Statut Membre Dernière intervention 2 mai 2023 1
10 juil. 2014 à 00:05
voici ce ke ça affiche :


mais pourquoi ça me met pas 1;2;3 a la place de 19;20;21 .
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 344
10 juil. 2014 à 00:56
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
}
0
msi79 Messages postés 509 Date d'inscription lundi 24 août 2009 Statut Membre Dernière intervention 2 mai 2023 1
11 juil. 2014 à 01:24
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>';
}
?>
0
Rejoignez-nous