Page 1 sur 1
Etablir le rang dans un classement
Posté : 15 oct. 2012, 11:14
par spilo
Bonjour,
Je cherche à établir le rang pour l'afficher à la place de l'actuel $rang (qui est juste incrémenté) sous la forme :
Clt - Nom Prénom - Licence - Points
1 - DUBOIS Jean - 007 - 86
2 - ROBERT David - 3652 - 80
3 - DURAND Joel - 12548 - 76
4 - BERNARD thomas - 3025 - 73
- RICHARD Francis - 458 - 73
- POTIN Jean-Pierre - 7963 - 73
5 - NICOLAS Edward - 6584 - 71
etc
Code : Tout sélectionner
$sql =
<<<SQL
SELECT
id_result,
manifestation,
type,
titre,
SUM(points) as points,
licence,
nom,
prenom,
id_joueur
FROM
resultats_opens_2012
INNER JOIN joueur ON resultats_opens_2012.licence = joueur.id_joueur
WHERE
resultats_opens_2012.type = "OP_FEM"
GROUP BY licence ORDER BY points DESC, nom ASC
SQL;
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$req.'<br />'.mysql_error());
$rang = 1;
if(($data = mysql_fetch_array($req)) != NULL) {
echo '<table width="500px">'."\n";
echo '<tr height="25" id="legend">';
echo '<td align="center"><b>Clt</b></td>';
echo '<td align="center"><b>Nom et Prénom</b></td>';
echo '<td align="center"><b>Licence</b></td>';
echo '<td align="center"><b>Points</b></td>';
echo '</tr>'."\n";
do {
echo '<tr>';
echo '<td align="center">'.$rang++.'</td>';
echo '<td> '.$data['nom'].' '.ucfirst($data["prenom"]).'</td>';
echo '<td align="center">'.$data['licence'].'</td>';
echo '<td align="center"> '.$data['points'].'</td>';
} while(($data = mysql_fetch_array($req)) != NULL);
echo '</table>'."\n";
}
else
{
echo '<div align="center"><h2>Aucunes joueuses dans ce clasement</h2></div>';
}
Merci d'avance pour vos pistes.
Re: Etablir le rang dans un classement
Posté : 15 oct. 2012, 12:10
par moogli
salut,
Si tu veux le faire en SQL pur tu peux tester les fonctions olap
http://sqlpro.developpez.com/article/ol ... se-window/
@+
Re: Etablir le rang dans un classement
Posté : 15 oct. 2012, 17:02
par spilo
J'ai bien regardé du côté de ton lien et écrit :
Code : Tout sélectionner
$sql =
<<<SQL
SELECT id_result, manifestation, type, titre, points, licence, nom, prenom, id_joueur
RANK() OVER (PARTITION BY licence ORDER BY points DESC) AS Rang
FROM
resultats_opens_2012
INNER JOIN joueur ON resultats_opens_2012.licence = joueur.id_joueur
WHERE
resultats_opens_2012.type = "OP_FEM"
SQL;
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$req.'<br />'.mysql_error());
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '() OVER (PARTITION BY...
Un problème de version de mySql ?
Re: Etablir le rang dans un classement
Posté : 15 oct. 2012, 23:33
par moogli
hum a priori pas implémenté chez mysql surtout :s (pas trouvé de doc récente :s).
la pour le coup te reste a faire une fonction perso qui réaliseras le traitement pour toi.
si tu n'as pas souvent d'entrée (ajout / modif) je te conseillerais une colonne en plus avec le rang et un trigger qui lance la mise a jour de cette colonne).
ceci dit s'il ne s'agit que de l'affichage ta méthode est tout aussi efficace je pense.
@+
Re: Etablir le rang dans un classement
Posté : 16 oct. 2012, 15:41
par spilo
pour le coup te reste a faire une fonction perso qui réaliseras le traitement pour toi.
Pourrais-tu développer un petit peu ?
je te conseillerais une colonne en plus avec le rang et un trigger qui lance la mise a jour de cette colonne
Est-ce que c'est possible de le faire en php ? ça m'a pas l'air simple ce "trigger" la mise à jour des rangs s'effectuerait quand ? lors de l'insertion d'un nouveau résultat ?
Re: Etablir le rang dans un classement
Posté : 16 oct. 2012, 18:51
par AB
C'est quoi ton problème ? Juste un problème d'affichage ?
Si oui pas besoin de s'embêter avec un trigger pour si peu dans le sens ou le traitement php est vraiment élémentaire. Si j'ai bien compris ton pb il te suffit d'enregistrer $data['points'] dans une variable, si la valeur suivante est différente, tu incrémente "rang", sinon tu ne l'incrémente pas.
Genre :
$rang = 0;
$points = -1;
while(($data = mysql_fetch_array($req)) != NULL)
{
$rang = $points != $data['points'] ? $rang++ : $rang ;
$points = $data['points'];
echo '<tr>';
echo '<td align="center">'.$rang.'</td>';
echo '<td> '.$data['nom'].' '.ucfirst($data["prenom"]).'</td>';
echo '<td align="center">'.$data['licence'].'</td>';
echo '<td align="center"> '.$data['points'].'</td>';
echo '</tr>';
}
Par sécurité tu devrais utiliser
htmlspecialchars pour protéger tes variables à l'affichage
Re: Etablir le rang dans un classement
Posté : 17 oct. 2012, 14:47
par spilo
C'est pas juste l'affichage, je me contenterai d'avoir le rang même s'il devait y avoir plusieurs instance d'un même numéro en cas d'égalité ...
J'ai fais ça et ça ne fonctionne pas :
<?php
mysql_query("SET NAMES 'utf8'");
// on recupere les infos concernant les points des joueuses
$sql =
<<<SQL
SELECT
id_result,
manifestation,
type,
titre,
SUM(points) as points,
licence,
nom,
prenom,
id_joueur
FROM
resultats_opens_2012
INNER JOIN joueur ON resultats_opens_2012.licence = joueur.id_joueur
WHERE
resultats_opens_2012.type = "OP_FEM"
GROUP BY licence ORDER BY points DESC, nom ASC
SQL;
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$req.'<br />'.mysql_error());
if(($data = mysql_fetch_array($req)) != NULL) {
$rang = 1;
$points = -1;
echo '<table width="500px">'."\n";
echo '<tr height="25" id="legend">';
echo '<td align="center"><b>Clt</b></td>';
echo '<td align="center"><b>Nom et Prénom</b></td>';
echo '<td align="center"><b>Licence</b></td>';
echo '<td align="center"><b>Points</b></td>';
echo '</tr>'."\n";
do {
$rang = $points != $data['points'] ? $rang++ : $rang ;
$points = $data['points'];
echo '<tr>';
echo '<td align="center">'.$rang++.'</td>';
echo '<td> '.$data['nom'].' '.ucfirst($data["prenom"]).'</td>';
echo '<td align="center">'.$data['licence'].'</td>';
echo '<td align="center"> '.$points.'</td>';
} while(($data = mysql_fetch_array($req)) != NULL);
echo '</table>'."\n";
}
else
{
echo '<div align="center"><h2>Aucunes joueuses dans ce clasement</h2></div>';
}
mysql_free_result($req);
?>
Tous les rangs sont à zéro

Re: Etablir le rang dans un classement
Posté : 17 oct. 2012, 20:04
par AB
Que donne le contenu de ta requête ?
Montre nous quelques lignes de ce resultat :
while(($data = mysql_fetch_array($req)) != NULL) print_r($data);
Re: Etablir le rang dans un classement
Posté : 17 oct. 2012, 20:50
par spilo
Ca m'affiche bien un tableau avec le total des points correspondant au même numéro de licence, mais ne calcul pas le rang
Code : Tout sélectionner
Clt Nom et Prénom Licence Points
1 DUBARD Stephanie 4084 10
2 BENETEAU Sabrina 5023 8
3 CERAIS Meggy 6170 8
4 ROBALT Marilyne 14964 3
Voilà le retour du print_r($data);
Code : Tout sélectionner
Array
(
[0] => 66
[id_result] => 66
[1] => ROUEN 2012
[manifestation] => ROUEN 2012
[2] => OP_FEM
[type] => OP_FEM
[3] => Finaliste
[titre] => Finaliste
[4] => 10
[points] => 10
[5] => 4084
[licence] => 4084
[6] => DUBARD
[nom] => DUBARD
[7] => stephanie
[prenom] => stephanie
[8] => 4084
[id_joueur] => 4084
)
Array
(
[0] => 65
[id_result] => 65
[1] => ROUEN 2012
[manifestation] => ROUEN 2012
[2] => OP_FEM
[type] => OP_FEM
[3] => Vainqueur
[titre] => Vainqueur
[4] => 8
[points] => 8
[5] => 5023
[licence] => 5023
[6] => BENETEAU
[nom] => BENETEAU
[7] => sabrina
[prenom] => sabrina
[8] => 5023
[id_joueur] => 5023
)
...
Re: Etablir le rang dans un classement
Posté : 18 oct. 2012, 04:07
par AB
Oui je me suis fait avoir comme un débutant avec l'incrémentation, remplace la ligne
$rang = $points != $data['points'] ? $rang++ : $rang ;
par
$rang = $points != $data['points'] ? ++$rang : $rang ;
Et fais attention, par la suite c'est
echo '<td align="center">'.$rang.'</td>';
et pas
echo '<td align="center">'.$rang++.'</td>';
Re: Etablir le rang dans un classement
Posté : 18 oct. 2012, 20:21
par spilo
En effet, ça fonctionne et affiche désormais ...
Code : Tout sélectionner
Clt Nom et Prénom Licence Points
1 DUBARD Stephanie 4084 10
2 BENETEAU Sabrina 5023 8
2 CERAIS Meggy 6170 8
3 ROBALT Marilyne 14964 3
...
toutefois, pour être conforme, ce classement devrait malgré tout afficher ROBALT Maryline "4" non ?
y a t-il beaucoup de modifications à effectuer pour parvenir à ce résultat ?
Re: Etablir le rang dans un classement
Posté : 19 oct. 2012, 03:49
par AB
Houlà oui c'est compliqué, ça te coûteras 1 million de dollars ...
$rang = 0;
$points = -1;
$egalite = 0;
while(($data = mysql_fetch_array($req)) != NULL)
{
if($points == $data['points'])
{
$egalite++;
}
else if ($egalite > 0)
{
$rang += $egalite+1;
$egalite = 0;
}
else
{
$rang++;
}
$points = $data['points'];
//...
echo '<td align="center">'.$rang.'</td>';
//...
}
me contacter par mp pour le règlement
Mais bon pour 100 000 dollars seulement, tu peux utiliser ça :
$rang = 1;
$points = 1;
$incr = 1;
while(($data = mysql_fetch_array($req)) != NULL)
{
$rang = $points == $data['points'] ? $rang : $incr;
$incr++;
$points = $data['points'];
//...
echo '<td align="center">'.$rang.'</td>';
//...
}
je pourrai pas faire moins cher

Re: [RESOLU] Etablir le rang dans un classement
Posté : 19 oct. 2012, 08:22
par spilo
Ca fonctionne parfaitement, merci beaucoup =D>
Afin de m'éclairer quelque peu quelqu'un pourrait détailler cette partie :
$rang = $points == $data['points'] ? $rang : $incr;
Re: [RESOLU] Etablir le rang dans un classement
Posté : 19 oct. 2012, 16:59
par AB
C'est la syntaxe des opérateurs ternaires,
expliquée ici.