IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Classement avec des ex-æquos


Sujet :

PHP & Base de données

  1. #1
    maf
    maf est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2003
    Messages : 76
    Points : 43
    Points
    43
    Par défaut Classement avec des ex-æquos
    Bonjour à tous,

    Voilà j'ai établi un classement sur des scores seulement seul problèmes, j'aimerais que la varible $a plutôt que de s'ingrémenter normalement affiche la même place dans le classement pour deux scores égaux.

    Voici mon code, comment pourrais-je le modifier ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <?
    $sql1 = "SELECT *  FROM `jeux`";
    $res1 = $con->sendSql($sql1);
    echo '';
    while ($row1 = mysql_fetch_array($res1, MYSQL_ASSOC)) {
     
    ?>
    <strong><?=stripslashes($row1["jeu1"])?></strong></br><?
    $sql = "SELECT `nom`,`score1`  FROM `scores` ORDER BY `score1` DESC";
    $a = 1;
    $res = $con->sendSql($sql);
    while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) {
     
    ?>
    <?=$a++?> // <?=stripslashes($row["nom"])?> // <?=stripslashes($row["score1"])?> </br>				
    <?
     
    }};
    ?>

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 97
    Points : 114
    Points
    114
    Par défaut
    Salut, il suffit de ne pas incrementer $a lorsque le score est identique au score précédent.

    Si le score actuel ,c.a.d $row["score1"], est égal au score précédent. Alors on ne doit pas incrémenter la place dans le classement, c.a.d $a.

    Comment peut-on comparer avec le score précédent ? C'est simple,
    on crée une variable $score_precedent et après chaque affichage du score on la remplit.

    Le seul problème c'est que avant le premier score il n'y a pas de score précédent, donc on initialise $score_précédent avec un score impossible, par exemple un score negatif, ou meme avec une chaine de charactere (vu que les scores sont des nombres).

    Voici que cela donnerait :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    <?
    $sql1 = "SELECT *  FROM `jeux`";
    $res1 = $con->sendSql($sql1);
     
    echo '';
    while ($row1 = mysql_fetch_array($res1, MYSQL_ASSOC)) 
    {
      ?>
      <strong><?=stripslashes($row1["jeu1"])?></strong></br>
      <?
     
      $sql = "      SELECT `nom`,`score1`  
                          FROM `scores` 
                   ORDER BY `score1` DESC
                ";
      $res = $con->sendSql($sql);
     
      $a                       = 0           ;
      $score_precedent = 'dummy' ;
     
      while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) 
      {
         // Si le score est différent du score précédent, incrementer la position
         // dans le classement 
         if ($row['score1'] != $score_precedent)  $a++ ;
     
         echo $a.' // '.stripslashes($row['nom']).'  //  '.stripslashes($row['score1']).' </br>' ;
     
         //Sauvegarder le score 
         $score_precedent = $row['score1'] ;    
      }
    }
    ?>

    Voila c'etait pas bien complique. Aussi j'ai du changer la valeur d'initialisation de $a, car on l'incremente avant de l'afficher maintenant.

    Bon amusement ;-)

  3. #3
    maf
    maf est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2003
    Messages : 76
    Points : 43
    Points
    43
    Par défaut re
    Merci ça marche niquel ... (je t'avoue que c'est un de mes premier code) et je suis content qu'il fonctionne déjà ...

    Par contre pour ma culture, le dummy, on peut mettre n'importe quoi ?

    Et mnt si je répète la même opération pour plusieurs jeux (6 au total) et qu'après je souhaite faire un classement général. (les jeux ont pas tous le même poids donc pas possible de faire une somme des scores)
    Le mieux c'est de faire le total des variables par nom ...

    Mais là le problème que j'ai, c'est ok, la variable globale c'est une chaîne d'addition, mais ... comment mettre en relation le NOM avec la PLACE du jeu ?

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 97
    Points : 114
    Points
    114
    Par défaut
    Citation Envoyé par maf Voir le message
    Merci ça marche niquel ... (je t'avoue que c'est un de mes premier code) et je suis content qu'il fonctionne déjà ...
    Félicitations, tu es sur la bonne voie.
    Par contre il y a quelque chose que je ne comprends pas ...
    Dans ton code tous les jeux ont les mêmes scores car tu réaffiches pour chaque jeux le contenu de la table `scores`.

    Tu devrais afficher les scores 'par jeu', donc la table score devrait contenir une référence au jeu. Il devrait au moins y avoir une colonne dans la table `score` qui indique a quel jeu correspond un score. Ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $sql = "        SELECT `nom`,`score1`, `jeu`  
                          FROM `scores`
                        WHERE `jeu` = '".$row1["jeu1"]."'
                   ORDER BY `score1` DESC
                ";
    PS: Souvent ce genre de référence, le nom du jeu, se font avec des clés. Dans la table `jeux` il y a surement une colonne id et dans la table `scores` une colonne jeux_id ou similaire. Alors la condition est plutôt jeu_id = $row1['id']. On appelle çà une foreign key (FK) ou clé étrangère.


    Par contre pour ma culture, le dummy, on peut mettre n'importe quoi ?
    A peu pres, le but c'est que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($row['score1'] != $score_precedent)  $a++ ;
    dans ce bout de code le $a++ s'exécute la première fois.
    Apres il aura des valeurs 'pertinente' et réels.

    Donc Oui, tu pourrais y mettre n'importe quoi. Tant que ce n'est pas une valeur possible de $row['score1'].


    Et mnt si je répète la même opération pour plusieurs jeux (6 au total) et qu'après je souhaite faire un classement général. (les jeux ont pas tous le même poids donc pas possible de faire une somme des scores)
    Le mieux c'est de faire le total des variables par nom ...
    Si tu veux faire çà pour plusieurs jeux, alors comme je l'explique plus haut, tu dois commencer a afficher les scores 'par jeux'.

    Si tu souhaites faire un classement générale il faut savoir quels sont tes
    règles de calculs ... La première étape avant d'informatiser un problème
    c'est de l'expliquer en detail, donner un exemple. Pourrais-tu expliquer comment tu calcul ton classement générale.

    Mais là le problème que j'ai, c'est ok, la variable globale c'est une chaîne d'addition, mais ... comment mettre en relation le NOM avec la PLACE du jeu ?
    Je ne comprends pas tres bien. J'imagine que c'est lie au problème précédent. Dans l'absolu sinon, pour mettre des choses en 'relations' on utilise des tableaux nomme en php ex. $joueurs[$row['nom']][$row['jeu']] = $row['score1'] ; Alors par exemple tu auras les points de robert au Monopoly dans $joueurs['robert']['Monopoly']

  5. #5
    maf
    maf est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2003
    Messages : 76
    Points : 43
    Points
    43
    Par défaut re
    Alors j'explique mieux ...

    Tous les mois, les 5 jeux changent (et j'ai donc une table jeux avec les noms des jeux).

    Ensuite ma table score est donnée ainsi : (nom ; score 1 ; score 2 ; score 3 ; score 4 ; score 5)

    Après, on établit un classement général en fonction de la position de chaque personne à chaque jeu (étant donné que chaque score n'a pas le même poids je peux pas faire un score total)

    Je répète donc 5 fois mon bout de code qui m'affiche les 5 classements.

    Et j'aimerais que pour Monsieur X maintenant, que la valeur de $a, $a1, $a2, $a3, $a4 soient additionnées ... ce qui me permettrait d'effectuer le classement général sur la base des positions.

    S'il est premier au jeu 1, 5ème au jeu 2, 7ème au jeu 3, 2ème au jeu 4 et 19ème au jeu 5 que ça m'affiche monsieur X : 1+5+7+2+19 = 34
    Et après établir un nouveau classement sur ces points là

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 97
    Points : 114
    Points
    114
    Par défaut
    Vu ce que tu m'as dit, tu vas avoir besoin :

    1. d'une variable $nb_jeu pour savoir dans quel colonne tu recupere le score.
      C'est pas tres propre comme facon de faire. Il y a une facon plus propre et plus simple de faire qui t'aurait permis d'avoir autant de jeux que tu le souhaites sans risquer de problemes dans ton code. En utilisant un JOINTURE et un Foreign key.
    2. D'un tableau avec la liste de tes utilisateurs et leur classement ... qu'on accumulera.
    3. Trier ce tableau

    .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    <?
    $sql1 = "SELECT *  FROM `jeux`";
    $res1 = $con->sendSql($sql1);
    $nb_jeu = 1 ;
     
    echo '';
    while ($row1 = mysql_fetch_array($res1, MYSQL_ASSOC)) 
    {
      ?>
      <strong><?=stripslashes($row1["jeu1"])?></strong></br>
      <?
     
      // ici --> on mets $nb_jeu pour choisir la bonne colonne
      // /!\ si tu as plus de 5 colonnes ca va foirer ...
      //     Il y a une solution a ce probleme mais
      //     c'est peut-etre pour une autre fois
      //     tant que t'as que 5 jeux ca ira.
      //
      $sql = "      SELECT `nom`,`score".$nb_jeu."`  
                          FROM `scores` 
                   ORDER BY `score1` DESC
                ";
     
      $res = $con->sendSql($sql);
     
      $a                       = 0           ;
      $score_precedent = 'dummy' ;
     
      while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) 
      {
         // Si le score est différent du score précédent, incrementer la position
         // dans le classement 
         if ($row['score1'] != $score_precedent)  $a++ ;
     
         echo $a.' // '.stripslashes($row['nom']).'  //  '.stripslashes($row['score1']).' </br>' ;
     
         if (!isset($classement[$row['nom']])) // si on enregistre son classement pour la 1er fois
         {
            $classement[$row['nom']] = $a ;  // ex: $classement['Jean'] = 7 ;
         }
         else // si on a deja un classement pour lui on lui ajoute le classement de ce jeux
         {
           $classement[$row['nom']] =  $classement[$row['nom']] + $a ;
           // Valeur du classement avant + valeur du nouveau classement
         }
     
         //Sauvegarder le score 
         $score_precedent = $row['score1'] ;    
      }
     
     
        $nb_jeu++ ; // on passe au jeu suivant 
     
    }
    ?>
     
    // Et maintenant il faut trier le tableau
    asort($classement) ; // trie le tableau
     
    foreach ($classement as $utilisateur => $place)
     {
        echo "Utilisateur : ".$utilisateur." // Moyenne de classement : ".($place/5)." // points de classement : ".$place."<br/>" ;
    }
    Evidemment je pense avoir fait un petit peu trop. S'il te plait n'hesite pas a poser des questions si tu ne comprends pas qqch.

  7. #7
    maf
    maf est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2003
    Messages : 76
    Points : 43
    Points
    43
    Par défaut re
    Ma fois ça à l'air de bien aller mais seulement pour le jeu 1 ...

    ça ne me renvoie qu'une seule colonne ...

    peut-être un problème dans mes tables ?

    J'ai deux tables : (schéma relationnel)

    Table jeux: (id_jeu, jeu1, jeu2, jeu3, jeu4, jeu5) jeui de type TEXT car le nom du jeu change tous les mois

    Table score: (nom, score1, score2, score3, score4, score5)

    Et en regardant ton code, je vois encore des 1 apparaître (après jeu et après score -> jeu1 et score1 ...)
    J'ai essayé de remplacé par ".$nb_jeu." mais il semble qu'à certaines places là synthaxe soit pas terrible terrible ...

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 97
    Points : 114
    Points
    114
    Par défaut
    My mistake, il faut remplacer toute les occurences de

    $row['score1'] par $row["score".$nb_jeu]

    Ca devrait marcher sinon, l'idee c'est que ca donne score1, score2, score3 ...

    Sinon je ne comprends pas bien la table jeux :
    Que contient id, jeu1, jeu2, jeu3, jeu4, jeu5 ?


    P.s. Ce n'est pas parce que ta BD est relationnel que ton schéma (tes tables) le sont. Ton application serait plus souples et plus compréhensible si tu avais 2 tables ainsi Jeux (id, nom), Score (nom_joueur, jeu_id, score)

    Jeux contiendrait par exemple ( (1,Scrabble), (2, Monopoly), (3, Tic-tac-toe), (4, solitaire), (5, Demineur) )

    Score contiendrait par exemple ((John, 1, 25), (John, 2, 7), (John, 3, 30), (John, 4, 13), (John, 5, 50), (Marc, 1, 24), ...)

    John qui a joue au jeu avec l'id 1 (Scrabble) a eu 25 points.
    John qui a joue eu jeu avec l'id 5 (Demineur) a eu 50 points.
    Marc qui a joue au jeu avec l'id 1 (Scrabble) a eu 7 points.

    Le champs jeu_id de score est une cle_etrangere ver la table Jeux.
    C'est l'une des forces des bd relationels. Faire des relations entre les tables.

    Par exemple si tu veux afficher par par jeux, la liste des joueurs classe par ordre decroissant de points ca donnerait en sql

    SELECT J.nom, S.nom_joueur, S.score
    FROM Score S
    JOIN Jeux J ON (S.jeux_id = J.id)
    ORDER BY J.nom ASC, S.nom_joueur ASC, S.score DESC

    Je te conseille vivement de feuilleter un cours de SQL et bd relationnel, tu
    pouras alors utiliser le reel potentiel de ces bases de donnees.

  9. #9
    maf
    maf est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2003
    Messages : 76
    Points : 43
    Points
    43
    Par défaut re
    Voilà donc le bout de code modifié ... seulement ... il ne m'affiche toujours que pour le jeu 1 ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    <?
    $sql1 = "SELECT *  FROM `jeux`";
    $res1 = $con->sendSql($sql1);
    $nb_jeu = 1 ;
     
    echo '';
    while ($row1 = mysql_fetch_array($res1, MYSQL_ASSOC)) 
    {
      ?>
      <strong><?=stripslashes($row1["jeu".$nb_jeu])?></strong></br>
      <?
     
      // ici --> on mets $nb_jeu pour choisir la bonne colonne
      // /!\ si tu as plus de 5 colonnes ca va foirer ...
      //     Il y a une solution a ce probleme mais
      //     c'est peut-etre pour une autre fois
      //     tant que t'as que 5 jeux ca ira.
      //
      $sql = "      SELECT `nom`,`score".$nb_jeu."`  
                          FROM `scores` 
                   ORDER BY `score".$nb_jeu."` DESC
                ";
     
      $res = $con->sendSql($sql);
     
      $a                       = 0           ;
      $score_precedent = 'dummy' ;
     
      while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) 
      {
         // Si le score est différent du score précédent, incrementer la position
         // dans le classement 
         if ($row["score".$nb_jeu] != $score_precedent)  $a++ ;
     
         echo $a.' // '.stripslashes($row['nom']).'  //  '.stripslashes($row["score".$nb_jeu]).' </br>' ;
     
         if (!isset($classement[$row['nom']])) // si on enregistre son classement pour la 1er fois
         {
            $classement[$row['nom']] = $a ;  // ex: $classement['Jean'] = 7 ;
         }
         else // si on a deja un classement pour lui on lui ajoute le classement de ce jeux
         {
           $classement[$row['nom']] =  $classement[$row['nom']] + $a ;
           // Valeur du classement avant + valeur du nouveau classement
         }
     
         //Sauvegarder le score 
         $score_precedent = $row["score".$nb_jeu] ;    
      }
     
     
        $nb_jeu++ ; // on passe au jeu suivant 
     
    }
     
     
    // Et maintenant il faut trier le tableau
    asort($classement) ; // trie le tableau
     
    foreach ($classement as $utilisateur => $place)
     {
        echo "Utilisateur : ".$utilisateur." // Moyenne de classement : ".($place/5)." // points de classement : ".$place."<br/>" ;
    }?>

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 97
    Points : 114
    Points
    114
    Par défaut
    Aides-toi et le ciel t'aideras !

    Sinon je ne comprends pas bien la table jeux :
    Que contient id, jeu1, jeu2, jeu3, jeu4, jeu5 ?
    Si tu pouvais faire un dump de tes 2 tables, (pas necessairement en entier).
    En fait ca aurait ete bien d'avoir ca des le debut. Mais bon.

  11. #11
    maf
    maf est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2003
    Messages : 76
    Points : 43
    Points
    43
    Par défaut re
    id = champ automatique (pour ma clé primaire)

    jeu 1 = nom du jeu 1
    jeu 2 = nom du jeu 2
    jeu 3 = nom du jeu 3
    jeu 4 = nom du jeu 4
    jeu 5 = nom du jeu 5

    Table jeux :


    Table scores :


    En fait je suis entrain de me dire que l'erreur vient du fait qu'on peut pas incrémenter sur la table jeux

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/03/2006, 15h15
  2. Réponses: 27
    Dernier message: 03/02/2003, 13h27
  3. créer un noeuds avec des paramétres
    Par Toxine77 dans le forum XMLRAD
    Réponses: 5
    Dernier message: 21/01/2003, 17h11
  4. Réponses: 2
    Dernier message: 06/12/2002, 08h50
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 14h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo