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

msi79 409 Messages postés lundi 24 août 2009Date d'inscription 5 avril 2018 Dernière intervention - 9 juil. 2014 à 14:43 - Dernière réponse : msi79 409 Messages postés lundi 24 août 2009Date d'inscription 5 avril 2018 Dernière intervention
- 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 

19 réponses

Répondre au sujet
jordane45 20567 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - Modifié par jordane45 le 9/07/2014 à 18:02
0
Utile
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
msi79 409 Messages postés lundi 24 août 2009Date d'inscription 5 avril 2018 Dernière intervention - Modifié par msi79 le 9/07/2014 à 16:36
0
Utile
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
msi79 409 Messages postés lundi 24 août 2009Date d'inscription 5 avril 2018 Dernière intervention - 9 juil. 2014 à 17:13
0
Utile
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
jordane45 20567 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 9 juil. 2014 à 18:04
0
Utile
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
msi79 409 Messages postés lundi 24 août 2009Date d'inscription 5 avril 2018 Dernière intervention - 9 juil. 2014 à 19:25
0
Utile
1
oui c'est la Moyenne de chaque élève... trié en ordre decroissant .
jordane45 20567 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 9 juil. 2014 à 20:04
Et pour le RANG ??? tu ne m'as pas répondu !
Commenter la réponse de msi79
msi79 409 Messages postés lundi 24 août 2009Date d'inscription 5 avril 2018 Dernière intervention - 9 juil. 2014 à 20:34
0
Utile
1
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 20567 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 9 juil. 2014 à 20:45
En testant </directement dans ta bdd quel message d'erreur EXACTE obtiens tu ?
Commenter la réponse de msi79
msi79 409 Messages postés lundi 24 août 2009Date d'inscription 5 avril 2018 Dernière intervention - 9 juil. 2014 à 21:20
0
Utile
1
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 20567 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 9 juil. 2014 à 21:24
Mais vas tu me dire enfin ce que tu appelles RANG ?????
Commenter la réponse de msi79
msi79 409 Messages postés lundi 24 août 2009Date d'inscription 5 avril 2018 Dernière intervention - Modifié par msi79 le 9/07/2014 à 22:01
0
Utile
3
le classement . classer les élèves du premier au dernier selon la moyenne obtenues
comme ceci :
jordane45 20567 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 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...
msi79 409 Messages postés lundi 24 août 2009Date d'inscription 5 avril 2018 Dernière intervention - 9 juil. 2014 à 22:21
je vois pas comment m'y prendre
jordane45 20567 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 9 juil. 2014 à 22:41
...... comment affiches tu ton tableau sur ta page (quel code) ?
Commenter la réponse de msi79
msi79 409 Messages postés lundi 24 août 2009Date d'inscription 5 avril 2018 Dernière intervention - 9 juil. 2014 à 22:46
0
Utile
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
jordane45 20567 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 9 juil. 2014 à 23:38
0
Utile

$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
msi79 409 Messages postés lundi 24 août 2009Date d'inscription 5 avril 2018 Dernière intervention - 10 juil. 2014 à 00:05
0
Utile
1
voici ce ke ça affiche :


mais pourquoi ça me met pas 1;2;3 a la place de 19;20;21 .
jordane45 20567 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 20 avril 2018 Dernière intervention - 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
}
Commenter la réponse de msi79
msi79 409 Messages postés lundi 24 août 2009Date d'inscription 5 avril 2018 Dernière intervention - 11 juil. 2014 à 01:24
0
Utile
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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.