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

Requêtes MySQL Discussion :

Trouver les meilleurs scores de chaque joueur


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Inscrit en
    Août 2004
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 32
    Points : 48
    Points
    48
    Par défaut Trouver les meilleurs scores de chaque joueur
    Bonjour, j'ai cherché sans succès la requête pour trouver les scores maximum de parties réalisées par des joueurs...

    Voici la structure simplifiée de la table des parties :

    TABLE PARTIES
    idPartie (clé primaire)
    scorePartie (score de la partie)
    datePartie (date de la partie)
    pseudoJoueur (pseudo du joueur ayant fait la partie)

    et il me faudrait pour chaque joueur l'enregistrement de la partie où il a réalisé son meilleur score... et pas seulement le meilleur score de chaque joueur mais bien l'enregistrement complet...

    Au départ j'ai tenté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select idPartie, MAX(scorePartie) as scoreMax, datePartie, pseudoJoueur
    from parties
    group by pseudoJoueur
    order by scoreMax desc
    en fait ça me retourne bien une ligne par joueur, avec effectivement son meilleur score, mais le reste de l'enregistrement ne correspond pas forcément au score : le scoreMax retourné ne correspond en général pas à l'identifiant de la partie (idPartie) ni à la date de la partie (datePartie)...
    Alors que je voudrais récupérer l'enregistrement entier correspondant au meilleur score de chaque joueur...

    Une idée ?

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    C'est un problème "classique" sous MySQL, qui est moins rigide que d'autres SGBD sur la clause GROUP BY (et du coup, ça pose souvent problème).
    Voici le lien vers un tutoriel qui explique pourquoi : http://cedric-duprez.developpez.com/...fier-group-by/
    Pour obtenir ce que tu souhaites, il va falloir passer par une sous-requête (donc il faut que ta version de MySQL soit au moins la 5.1).

    Il faut alors soit passer par une sous-requête (mais les performances peuvent rapidement se dégrader avec la volumétrie), soit passer par la requête suivante, qui évite les sous-requêtes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT t1.idPartie, t1.scorePartie AS scoreMax, t1.datePartie, t1.pseudoJoueur
    from parties t1
    inner join parties t2 on t1.pseudoJoueur = t2.pseudoJoueur
    group by t1.idPartie, t1.scorePartie, t1.datePartie, t1.pseudoJoueur
    having t1.scorePartie = max(t2.scorePartie)
    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Membre du Club
    Inscrit en
    Août 2004
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 32
    Points : 48
    Points
    48
    Par défaut
    Bonjour, et merci pour la réponse intéressante. J'ai parcouru le tuto indiqué découvert des trucs intéressants...!

    Alors la requête proposée fonctionne bien mais pose 2 problèmes :
    - Un joueur ayant réalisé 2 fois le même score apparait 2 fois
    - Le temps d'exécution de la requête est TRES long

    Pour le temps, j'ai rajouté les index manquants, mais le temps était toujours trop long (environ une seconde, c'est trop de charge pour le serveur). On passe je pense à un parcours de type n² (pour chaque enreg, on lit tous les autres) et je souhaite plutôt un parcours de type n...

    Du coup j'ai trouvé un contournement, peut-être pas très orthodoxe mais qui fonctionne bien. Je crée une chaîne qui est la concaténation de mon score et de l'identifiant de la partie (6 caractères pour chaque donnée), et c'est le max de cette chaîne que j'utilise...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select max(right(concat('000000',scorePartie,right(CONCAT('000000',idPartie),6)),12)) from parties
    puis je récupère pour chaque ligne du résultat l'idPartie. Ensuite, je constitue une liste de mes idPartie et je fais une seconde requête avec un find_in_set dans lequelle j'indique la liste de mes idPartie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from parties where find_in_set(idPartie,'".$listeId."') order by score desc
    Avec cette solution, le temps de réponse est quasi-instantané.
    Mais il y a sans doute mieux ou plus élégant pour la même performance.

    Le but était d'afficher la page des classements d'un jeu de tables de multiplications pour les enfants !
    Le résultat peut être vu là :
    http://marlot.org/multiplication/?pg=podium

    Nicolas

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 15/06/2011, 13h43
  2. trouver les meilleures combinaisons
    Par Emma95 dans le forum Excel
    Réponses: 15
    Dernier message: 15/04/2010, 14h20
  3. Réponses: 5
    Dernier message: 08/08/2008, 11h34
  4. Algorithme permettant de garder les meilleurs score
    Par mhtrinh dans le forum Algorithmes et structures de données
    Réponses: 13
    Dernier message: 13/12/2007, 16h54
  5. Où trouver les meilleurs thèmes ?
    Par elitost dans le forum Ubuntu
    Réponses: 3
    Dernier message: 25/09/2007, 14h06

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