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 :

Somme et classement [PostgreSQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Août 2009
    Messages : 24
    Par défaut Somme et classement
    Bonjour,

    Après plusieurs jours de prise de tête et de recherche sur internet et sur ce forum, je me décide à poster un message pour faire appel à votre aide.

    But : Faire un classement des joueurs en fonction du type de match (simple, double ou mixte) et de leurs résultat en tournoi (diiférence entre le nombre de victoires et le nombres de défaites)

    Organisation de la base postgre : 3 tables
    - Table biben_tournoi : liste des tournoi
    • btid : clé primaire
    • nom : nom du tournoi


    - Table biben_joueur : liste des joueurs
    • bjid : clé primaire
    • nom : nom du joueur
    • prenom : prénom du joueur

    - Table biben_match : liste des matchs
    • mid : clé primaire
    • bjid : clé pour lien avec la table joueur
    • btid : clé pour lien avec la table tournoi
    • type_match : simple , double ou mixte
    • nb_victoires : nombre de victoires durant le tournoi
    • nb_defaites : nombre de défaites durant le tournoi
    • diff_match : nb_victoires - nb_défaites


    J'arrive via les requètes à faire 3 tableaux (simple, double, mixte) et à faire le classement par diff_match

    Problème : Je ne vois pas comment faire, par joueur, la somme de victoires - somme de défaites, et faire le classment
    J'ai fait plusieurs recherches je ne parvient pas à le faire via du PHP.
    Cela fait plusieurs jours que je suis sur ce problème, et je crois que je n'ai plus les idées bien clair.


    Par avance merci à ceux qui pourrais m'aider

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 672
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 672
    Par défaut
    Montre nous des requêtes que tu as déjà essayées

  3. #3
    Membre averti
    Inscrit en
    Août 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Août 2009
    Messages : 24
    Par défaut
    Requete pour la récupération de l'ID des joueurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $query_idjoueurs = 'SELECT biben_joueur.bjid FROM biben_joueur';
    Requete pour la liste des matchs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $query_matchs = 'SELECT biben_match.bjid, biben_match.type_match , biben_match.nb_victoires, biben_match.nb_defaites, biben_match.diff_matchs FROM biben_match';
    Ensuite pour chaque id de joueur, je regarde dans chaque ligne de matchs.
    J'arrive à récupérer le nb_victoires total pour chaque joueurs et à le stocker dans la BDD mais je me demandais si il n'y avais pas possibilité de ne pas repasser par la base

    Voici mon code pour le moment :
    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
    <?php
      include("connexion.inc.php");
     
          /* code du script … */
      echo "<p>Classement Bibendum :</p>";
      // Liste des requêtes SQL
      $query_matchs = 'SELECT biben_match.bjid, biben_match.type_match , biben_match.nb_victoires, biben_match.nb_defaites, biben_match.diff_matchs FROM biben_match';
      $query_idjoueurs = 'SELECT biben_joueur.bjid FROM biben_joueur';
     
      // Exécution des requêtes SQL
      $liste_matchs = pg_query($query_matchs) or die('Échec requête : ' . pg_last_error());
      $liste_idjoueurs = pg_query($query_idjoueurs) or die('Échec requête : ' . pg_last_error());
     
      // Nombre de lignes dans les requêtes
      $nbjoueurs = pg_num_rows($liste_idjoueurs);
      $nbmatchs = pg_num_rows($liste_matchs);
     
      $id = 0;
      echo "<p>Nb de joueurs : $nbjoueurs<br>";
      echo "Nb de matchs : $nbmatchs</p>";
     
      for($i = 0; $i<$nbjoueurs; $i++)
      {
    	// Variables
    	$nbvictoires = 0;
    	$nbdefaites = 0;
     
    	// Récupération de l'id du joueur
    	$id = pg_fetch_result($liste_idjoueurs, $i, 0);
     
    	// Requete, execution de la requete et comptage du nombre de lignes
    	$requete_victoires = "SELECT nb_victoires FROM biben_match WHERE bjid='$id';";
    	$resultat_victoires = pg_query($requete_victoires) or die('Échec requête : ' . pg_last_error());
    	$nblignesvictoires = pg_num_rows($resultat_victoires);
     
    	for ($j = 0; $j<$nblignesvictoires; $j++)
    	{
    		$nbvictoires = $nbvictoires + pg_fetch_result($resultat_victoires, $j, 0);
    	}
    	$req_update_victoires = "UPDATE biben_joueur SET nb_victoires='$nbvictoires' WHERE bjid='$id';";
    	$update_victoires = pg_query($req_update_victoires) or die('Échec requête : ' . pg_last_error());
     
    	// Libere le resultset
    	pg_free_result($resultat_victoires);
    	pg_free_result($update_victoires);
      }
     
      // Libère le resultset
      pg_free_result($liste_matchs);
      pg_free_result($liste_idjoueurs);
     
      /* Déconnexion du serveur */
      pg_close($dbconn);
      //echo "Deconnexion du serveur.";
    ?>
    Mais pour cela j'ai du rajouter un champs nbvictoires dans ma table biben_joueur donc si je veux faire la différence simple/double/mixte, il faudrait que je créé les champs nbvictoires_simple, nbvictoires_double et nbvictoires_mixte et de même pour nbdefaites et diff_match.
    Je pense que cela ferais un peu doublon avec la table biben_match et ne serais pas génial pour ce qui est des performances mais si il n'y a pas d'autres solutions.

  4. #4
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Et pourquoi ne pas tout faire dans la db , une table comme ceci

    # mid : clé primaire
    # bjid : clé pour lien avec la table joueur
    # btid : clé pour lien avec la table tournoi
    # type_match : simple , double ou mixte
    # resultat : victoires = 1, défaite = 0 durant le tournoi

    Après on peut faire des requêtes de type

    Nombres de victoire suivant type de match
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT COUNT(resultat)
    FROM latable
    WHERE resultat = 1
    AND bjid = id
    GROUP BY type_match

  5. #5
    Membre averti
    Inscrit en
    Août 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Août 2009
    Messages : 24
    Par défaut
    La requete que tu me propose compte le nombre de fois où apparais victoires
    Or dans un tournoi (de badminton puisque c'est le sport dont il est question), un joueur peut, par exemple, gagner 2 matchs et en perdre 1.

    En m'inspirant de ta requete, j'ai testé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT COUNT(nb_victoires)
    FROM biben_match
    WHERE bjid = 2
    GROUP BY type_match
    PS : bjid=2 car pour faire un test avec ce qui est dans ma table
    Ce qui m'a retourné : en nombre de victoire en simple : 1

    J'ai remodifié la requete que tu m'a proposé pour faire celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT biben_joueur.prenom, biben_match.type_match, SUM(biben_match.nb_victoires), SUM(biben_match.nb_defaites), SUM(biben_match.diff_matchs) 
    FROM biben_joueur, biben_match
    WHERE biben_joueur.bjid=biben_match.bjid
    AND biben_match.type_match=$type_match
    GROUP BY biben_joueur.prenom, biben_match.type_match
    ORDER BY biben_match.type_match, SUM(biben_match.diff_matchs)
    PS : biben_match.type_match=$type_match, comme ça je pourrais faire mes 3 tableaux séparés.

    Merci MaitrePylos de m'avoir montré la voix
    Je vais tester ça dès que possible et je reviens ici pour vous tenir au courant !

  6. #6
    Membre averti
    Inscrit en
    Août 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Août 2009
    Messages : 24
    Par défaut
    La requete semble bien fonctionner mais tout ne s'affiche pas dans mon tableau.
    La somme de victoires et la somme de défaites ne s'affichent pas.
    J'ai bien mes en-tetes de colonne : Joueur victoires defaites diff
    mais dans
    • joueur : j'ai le prenom du joueur
    • victoires : j'ai la diff
    • défaites : rien
    • diff : rien


    Voici mon code :
    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
    <?php
      include("connexion.inc.php");
      echo "<p><center>Classement :</center></p>";
     
      // Variables
      $typematch = "simple";
     
      // Requete
      $query = "SELECT biben_joueur.prenom, SUM(biben_match.nb_victoires), SUM(biben_match.nb_defaites), SUM(biben_match.diff_matchs) FROM biben_joueur, biben_match WHERE biben_joueur.bjid=biben_match.bjid AND biben_match.type_match='$typematch' GROUP BY biben_joueur.prenom, biben_match.type_match ORDER BY biben_match.type_match, SUM(biben_match.diff_matchs);";
      $result = pg_query($query) or die('Échec requête : ' . pg_last_error());
     
      // Affichage de la requete
      echo "<table border=\"1\">\n";
      echo "<tr><th>Joueur</th><th>Victoires</th><th>Defaites</th><th>Diff</th>";
      while ($line = pg_fetch_array($result, null, PGSQL_ASSOC))
      {
        echo "\t<tr align=\"center\">\n";
        foreach ($line as $col_value)
        {
            echo "\t\t<td>$col_value</td>\n";
        }
        echo "\t</tr>\n";
      }
        echo "</table>\n";
     
      // Libère le resultset
      pg_free_result($result);
     
      /* Déconnexion du serveur */
      pg_close($dbconn);
    ?>

  7. #7
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Attention dans ta requête tu fais ceci

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GROUP BY biben_joueur.prenom, biben_match.type_match

    Tu groupes sur les prénoms, donc si j'ai plusieurs personnes portant le même prénoms, il ne seront considéré que comme une personnes

    Je referais ta requête ainsi

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT biben_joueur.prenom, biben_match.type_match, 
    SUM(biben_match.nb_victoires) AS victoire, 
    SUM(biben_match.nb_defaites) AS defaite, 
    (SUM(biben_match.nb_victoires) - SUM(biben_match.nb_defaites) ) AS difference_match -- attention négatif si défaite plus grand que victoire
    	FROM biben_joueur
    INNER JOIN biben_match
    	ON biben_joueur.bjid=biben_match.bjid
    WHERE biben_match.type_match=$type_match
    GROUP BY biben_match.type_match
    ORDER BY biben_match.type_match

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL-5.6] Classement selon un score avec somme et comptage
    Par yoshï dans le forum Requêtes
    Réponses: 2
    Dernier message: 14/11/2014, 12h39
  2. [math] somme de plusieurs vecteurs à 3 dimensions
    Par teska dans le forum Mathématiques
    Réponses: 5
    Dernier message: 04/06/2003, 21h40
  3. - [procédure stockée] - Problème de Somme
    Par korrigann dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 20/05/2003, 11h51
  4. [CR ?] Somme d'heure sous Crystal ?
    Par Peter PARKER dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 17/04/2003, 16h24
  5. xsl : sous sommes?
    Par Slash dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 31/03/2003, 13h34

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