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

Langage SQL Discussion :

[Requête] Classement de Scores


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 128
    Points : 61
    Points
    61
    Par défaut [Requête] Classement de Scores
    Salut à tous !

    Voila une bonne heure que j'essaye en vain d'effectuer une requête de classement, celle ci est à effectuer sur une table SCORE, qui contient pour chaques jeux les scores de chaques joueurs en vus d'établir des classements :


    J'aimerais un classement général des tous meilleurs joueurs du site,
    un meilleur score c'est la meilleur performance sur un jeu, en faite je désirerais :
    -sélectionner pour chaque jeu le meilleur joueur (celui qui à le plus grand score, il n'y a qu'un seul meilleur score par jeu, mais un joueur peut avoir plusieurs meilleurs scores)
    -faire une somme pour chaque joueur du nombre de ses meilleurs scores : son nombre de victoires.
    -Puis avec ce nombre, optenir le nombre un classement des joueurs ayant le plus de victoires ...


    Résultat sous cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    -- Le résultat attendu :
    Pseudo           HighScores
    ------            ----------  
    Webmaster     50          
    xxxxx             49      
    ...
    _______________________________________________________


    Bref je sais je suis pas doué en SQL , pas faute d'avoir essayé, mais là je sèche ...

    Merci d'avance à tous ceux qui pourraient m'aider

    Bonne fin de soirée

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 774
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 774
    Points : 52 746
    Points
    52 746
    Billets dans le blog
    5
    Par défaut
    comencez par nous expliquer ce qu'est un meilleur score

    Ensuite donnez un jeu d'essai et la bouille de la résponse attendue

    En fait, respectez la charte de postage :
    http://www.developpez.net/forums/showthread.php?t=944

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 128
    Points : 61
    Points
    61
    Par défaut
    Bonsoir,

    Merci pour les conseils, j'ai effectué quelques modifications, en espérant que cela soit plus clair.


    Un meilleur score c'est la meilleur performance sur un jeu, en faite je désirerais sélectionner pour chaque jeu le meilleur joueur (celui qui à le plus grand score), et faire une somme pour chaques joueurs du nombre de leur meilleur scores, en vu d'optenir le nombre total de victoires pour un joueur et ainsi en faire un classement ...

    J'espère que c'est un peu plus clair, merci d'avance à tous

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Points : 201
    Points
    201
    Par défaut
    salut,

    Pour le meilleur score de chaque jeu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT PseudoScore, MAX(ValScore) as MeilleurScore, ScoreJeu FROM Score  GROUP BY ScoreJeu ORDER BY ScoreJeu, MeilleurScore

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 128
    Points : 61
    Points
    61
    Par défaut
    Salut !

    Merci à toi pour cette requête, elle renvoi bien le meilleur score pour chaque jeux, mais le pseudo associé au meilleur score n'est pas le bon ...

    Une autre idée pour cette requête ... ?
    Merci d'avance

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Points : 201
    Points
    201
    Par défaut
    Normalement si..
    bon je viens de modifier et de tester avec ton jeu d'essai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT PseudoScore, MAX( ValScore ) AS MeilleurScore, ScoreJeu
    FROM Score
    GROUP BY ScoreJeu
    ORDER BY PseudoScore, MeilleurScore DESC
    avec ceci tu as les meilleurs scores de chaque jeu par ordre alpha du pseudo et du meilleur score...

    sauf que je viens de me rendre compte qu'il mettais webmaster pour airfox...bizarre !!

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Points : 201
    Points
    201
    Par défaut
    finalement voici la bonne requete (normalement ! )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT Score.PseudoScore, Q1.MeilleurScore, Q1.ScoreJeu
    FROM Score
    INNER JOIN (
     
    SELECT Max( ValScore ) AS MeilleurScore, ScoreJeu
    FROM Score
    GROUP BY ScoreJeu
    ORDER BY ScoreJeu
    ) AS Q1 ON ( Score.ValScore = Q1.MeilleurScore )
    AND (
    Score.ScoreJeu = Q1.ScoreJeu
    )
    ORDER BY Score.PseudoScore ASC
    et pour le total des scores par pseudo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT Score.PseudoScore, sum( ValScore ) AS total
    FROM Score
    GROUP BY Score.PseudoScore
    ORDER BY total
    Mais bon je ne suis pas sûre à 100 % alors si un expert voulait bien confirmer ;-) ça m'aiderait à me corriger

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 128
    Points : 61
    Points
    61
    Par défaut
    Bravo pour ta première requête, elle en impose (un peu lourde à executer avec 15000 score ^^), mais elle donne vraiment le bon résultat , Merci à toi

    Par contre au niveau de la deuxième, c'est pas tous à fait ca que j'aimerais, en faite tu fais la somme des scores pour chaques pseudo.
    Et moi j'aimerais grace à ta requête précedente, compter (COUNT) le nombre de meilleurs scores pour chaque pseudo (GROUP BY PseudoScore), pour savoir qui a le plus grand nombre de meilleur scores, et ainsi établir un classement.

    Qui donnerait un résultat de cette manière si possible :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Pseudo             NbBestScores
    ------              ----------  
    Webmaster       50          
    Caro                49 
    xxxxx               26     
    ...                   ...
    Je sais pas si j'ai été plus clair ^^
    Mais je t'en (et vous) remerci d'avance !

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Points : 201
    Points
    201
    Par défaut
    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
     
     
    SELECT COUNT(nombre.Pseudo), Score.PseudoScore FROM
    (
     
    SELECT Score.PseudoScore as Pseudo, Q1.MeilleurScore, Q1.ScoreJeu
    FROM Score
    INNER JOIN (
     
    SELECT Max( ValScore ) AS MeilleurScore, ScoreJeu
    FROM Score
    GROUP BY ScoreJeu
    ORDER BY ScoreJeu
    ) AS Q1 ON ( Score.ValScore = Q1.MeilleurScore )
    AND (
    Score.ScoreJeu = Q1.ScoreJeu
    )
    ORDER BY Score.PseudoScore ASC 
    ) as nombre
    GROUP BY Score.PseudoScore
    bon alors j'ai pas encore testé ;-) je te laisse le faire...

    par contre après mûre réflexion (faut le temps ! ) ceci ne te donne QUE les joueurs ayant le meilleur score ! si tu veux aussi les joueurs n'ayant pas de meilleur score il faut mettre LEFT OUTER JOIN au lieu de INNER JOIN dans la première requete, mais ensuite pour calculer le nombre de victoire d'après la première requete. vu que tu fais un sum(pseudo) il va compter tous les pseudos de la première requete. faudrait donc faire un truc dans le genre si null alors nbre de victoire = 0 peut etre avec un case ou un coalesce, mais alors là faut voir avec les experts

    bon courage

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 128
    Points : 61
    Points
    61
    Par défaut
    Merci pour ta peine, on va bien y arriver !

    j'ai une erreur pour ta requête :

    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
     
    SELECT COUNT(nombre.Pseudo), score.PseudoScore FROM
    (
    SELECT score.PseudoScore as Pseudo, Q1.MeilleurScore, Q1.ScoreJeu
    FROM score
    INNER JOIN (
     
    SELECT Max( ValScore ) AS MeilleurScore, ScoreJeu
    FROM score
    GROUP BY ScoreJeu
    ORDER BY ScoreJeu
    ) AS Q1 ON ( score.ValScore = Q1.MeilleurScore )
    AND (
    score.ScoreJeu = Q1.ScoreJeu
    )
    ORDER BY score.PseudoScore ASC 
    ) AS nombre
    GROUP BY score.PseudoScore
    L'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     MySQL a répondu:Documentation
    #1054 - Unknown column 'score.PseudoScore' in 'field list'
    Bizarre

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Points : 201
    Points
    201
    Par défaut
    oui logique ;-)

    mets GROUP BY nombre.Pseudo; et dans le SELECT COUNT(nombre.Pseudo) rajoute as nbre_victoire, nombre.Pseudo....

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Points : 201
    Points
    201
    Par défaut
    et la requete pour le classement

    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
    SELECT max( final.nb_victoire ) AS nombre_victoire, final.Pseudo
    FROM (
     
    SELECT count( nombre.Pseudo ) AS nb_victoire, nombre.Pseudo
    FROM (
     
    SELECT Score.PseudoScore AS Pseudo, Q1.MeilleurScore, Q1.ScoreJeu, 
    CASE WHEN Q1.MeilleurScore IS NULL 
    THEN 0 
    ELSE 1 
    END AS nbre_victoire
    FROM Score
    LEFT OUTER JOIN (
     
    SELECT Max( ValScore ) AS MeilleurScore, ScoreJeu
    FROM Score
    GROUP BY ScoreJeu
    ORDER BY ScoreJeu
    ) AS Q1 ON ( Score.ValScore = Q1.MeilleurScore ) 
    AND (
    Score.ScoreJeu = Q1.ScoreJeu
    )
    ORDER BY Score.PseudoScore ASC 
    ) AS nombre
    WHERE nombre.nbre_victoire =1
    GROUP BY nombre.Pseudo
    UNION 
    SELECT nombre.nbre_victoire, nombre.Pseudo
    FROM (
     
    SELECT Score.PseudoScore AS Pseudo, Q1.MeilleurScore, Q1.ScoreJeu, 
    CASE WHEN Q1.MeilleurScore IS NULL 
    THEN 0 
    ELSE 1 
    END AS nbre_victoire
    FROM Score
    LEFT OUTER JOIN (
     
    SELECT Max( ValScore ) AS MeilleurScore, ScoreJeu
    FROM Score
    GROUP BY ScoreJeu
    ORDER BY ScoreJeu
    ) AS Q1 ON ( Score.ValScore = Q1.MeilleurScore ) 
    AND (
    Score.ScoreJeu = Q1.ScoreJeu
    )
    ORDER BY Score.PseudoScore ASC 
    ) AS nombre
    WHERE nombre.nbre_victoire =0
    GROUP BY nombre.Pseudo
    ORDER BY nb_victoire
    ) AS final
    GROUP BY final.Pseudo
    ORDER BY nombre_victoire DESC

    J'espère que je ne me suis pas plantée...

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 128
    Points : 61
    Points
    61
    Par défaut
    Nickel ca fonctionne impeccable ! Bravo à toi pour cette belle requête, respect ... et surtout un grand Merci à toi !!!

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Points : 201
    Points
    201
    Par défaut
    de rien remarque je sais pas si on peut faire plus court....

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

Discussions similaires

  1. [AC-2010] Requête Classement selon critère
    Par stsym dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 12/09/2013, 07h55
  2. [SQL] Requête classement sport
    Par drake10569 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 27/02/2007, 19h43
  3. problème classement de date dans une requête
    Par heteroclite dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 15/10/2006, 15h55
  4. Optimiser une requête de "classement"
    Par Manu0086 dans le forum Requêtes
    Réponses: 7
    Dernier message: 09/03/2006, 18h47
  5. Réponses: 2
    Dernier message: 18/02/2006, 17h07

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