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

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

Votre réponse

19 réponses

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


mais pourquoi ça me met pas 1;2;3 a la place de 19;20;21 .
Messages postés
23244
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 novembre 2018
- 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
Messages postés
455
Date d'inscription
lundi 24 août 2009
Dernière intervention
9 octobre 2018
- 11 juil. 2014 à 01:24
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

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.