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

Messages postés
496
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
8 novembre 2019
- - Dernière réponse : msi79
Messages postés
496
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
8 novembre 2019
- 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 :

Afficher la suite 

12 réponses

Messages postés
27049
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 décembre 2019
318
0
Merci
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
Commenter la réponse de jordane45
Messages postés
496
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
8 novembre 2019
0
Merci
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
Commenter la réponse de msi79
Messages postés
496
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
8 novembre 2019
0
Merci
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;
}

?>
Commenter la réponse de msi79
Messages postés
27049
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 décembre 2019
318
0
Merci
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 ?
Commenter la réponse de jordane45
Messages postés
496
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
8 novembre 2019
0
Merci
oui c'est la Moyenne de chaque élève... trié en ordre decroissant .
jordane45
Messages postés
27049
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 décembre 2019
318 -
Et pour le RANG ??? tu ne m'as pas répondu !
Commenter la réponse de msi79
Messages postés
496
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
8 novembre 2019
0
Merci
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
";
jordane45
Messages postés
27049
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 décembre 2019
318 -
En testant </directement dans ta bdd quel message d'erreur EXACTE obtiens tu ?
Commenter la réponse de msi79
Messages postés
496
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
8 novembre 2019
0
Merci
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
";
jordane45
Messages postés
27049
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 décembre 2019
318 -
Mais vas tu me dire enfin ce que tu appelles RANG ?????
Commenter la réponse de msi79
Messages postés
496
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
8 novembre 2019
0
Merci
le classement . classer les élèves du premier au dernier selon la moyenne obtenues
comme ceci :
jordane45
Messages postés
27049
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 décembre 2019
318 -
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...
msi79
Messages postés
496
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
8 novembre 2019
-
je vois pas comment m'y prendre
jordane45
Messages postés
27049
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 décembre 2019
318 -
...... comment affiches tu ton tableau sur ta page (quel code) ?
Commenter la réponse de msi79
Messages postés
496
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
8 novembre 2019
0
Merci
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>
Commenter la réponse de msi79
Messages postés
27049
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 décembre 2019
318
0
Merci

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



Commenter la réponse de jordane45
Messages postés
496
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
8 novembre 2019
0
Merci
voici ce ke ça affiche :


mais pourquoi ça me met pas 1;2;3 a la place de 19;20;21 .
jordane45
Messages postés
27049
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 décembre 2019
318 -
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
}
Commenter la réponse de msi79
Messages postés
496
Date d'inscription
lundi 24 août 2009
Statut
Membre
Dernière intervention
8 novembre 2019
0
Merci
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>';
}
?>
Commenter la réponse de msi79