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 :

Problème avec MAX()


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 7
    Points
    7
    Par défaut Problème avec MAX()
    Bonjour,

    Je cherche à executer une requete me renvoyant un classement pour un jeu en fonction du score inscris en BDD.

    Ma requete SQL :
    SELECT id_play, id_user, MAX(score)
    FROM play
    WHERE id_game=1
    GROUP BY USER_REF_id_user_ref
    ORDER BY score DESC

    Si tous les users sont différents ... tout se passe bien.
    Si un user à jouer plusieurs fois, l'id_user et le score sont bons, mais l'id_play (qui est une clef primaire) renvoyé correspond à la première entrée dans la table.

    Par exemple, si j'ai dans ma table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    id_play        id_user      id_game      score
    1		1		1		100
    2		2		1		500
    3		1		1		300
    ma requete va me renvoyer :
    2 2 500
    1 1 300

    alors que je souhaiterai :
    2 2 500
    3 1 300

    Merci pour votre aide.

  2. #2
    En attente de confirmation mail
    Inscrit en
    Mai 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 56
    Points : 54
    Points
    54
    Par défaut
    je m'interroge sur la nature de USER_REF_id_user_ref dans le group by ... sous quel SGBD travailles-tu ?

    Mon avis est que la requête effectue bien le calcul du score max pour chaque joueur dans un premier temps. Donc identifie bien que le joueur 1 a le deuxième meilleur score. Puis dans un second temps, va chercher l'id play pour le joueur 2 (meilleur score) et renvoie 2 puis pour le joueur 1 (deuxième) et renvoie le premier id trouvé (donc id_play=1).

    Tu dois donc spécifier dans la requête que tu ne t'intéresses, pour chaque joueur, qu'à l'enregistrement concernant son meilleur score à un jeu donné.

    la requête suivante devrait t'aider :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT id_play, id_user, MAX(score)
    FROM play p
    WHERE id_game=1
    and score = (
    	select max(score) from play p2
    	where p2.id_user=p.id_user
    	and p2.id_game=p.id_game
    )
    GROUP BY id_play, id_user, score
    ORDER BY score DESC;
    .. en espérant que ton SGBD accepte les requêtes imbriquées ...

  3. #3
    En attente de confirmation mail
    Inscrit en
    Mai 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 56
    Points : 54
    Points
    54
    Par défaut
    petite erreur:

    dans ce cas MAX et GROUP BY ne semblent plus avoir d'utilité .... ce qui donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT id_play, id_user, score
    FROM play p
    WHERE id_game=1
    AND score = (
    	SELECT max(score) FROM play p2
    	WHERE p2.id_user=p.id_user
    	AND p2.id_game=p.id_game
    )
    ORDER BY score DESC;

  4. #4
    En attente de confirmation mail
    Inscrit en
    Mai 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 56
    Points : 54
    Points
    54
    Par défaut
    OK donc je reconnecte mon cerveau ... quand je t'ai répondu j'étais en train de lir des posts sur le forum general SGBD et je me suis un peu emmellé les pinceaux, désolé.

    Donc ton SGBD est mySQL. Maintenant la question est : la version que tu utilises supporte-t-elle les requêtes imbriquées ?

    Voila, désolé si mon post n'a servit à rien ...

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Salut bmeurant,

    je m'interroge sur la nature de USER_REF_id_user_ref dans le group by
    Ouais il fallait lire "id_user" à la place de "USER_REF_id_user_ref" j'ai juste renommé les champs avant de poster pour que ca soit un peu plus lisible ^^

    Donc ton SGBD est mySQL. Maintenant la question est : la version que tu utilises supporte-t-elle les requêtes imbriquées ?
    Oui je suis sous MySQL 5.0.22 donc pas de problème.
    Ta solution marche parfaitement.

    Merci beaucoup

  6. #6
    En attente de confirmation mail
    Inscrit en
    Mai 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 56
    Points : 54
    Points
    54
    Par défaut
    You're welcome.

    N'oublie pas de marquer ton post comme résolu.

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

Discussions similaires

  1. problème avec Max date
    Par berti dans le forum Langage SQL
    Réponses: 5
    Dernier message: 13/07/2011, 16h15
  2. Problème avec "MAX"
    Par guivrator dans le forum Requêtes
    Réponses: 5
    Dernier message: 16/04/2009, 15h25
  3. Problème avec "MAX" et/ou "TOP"
    Par funkyjul dans le forum Développement
    Réponses: 6
    Dernier message: 18/03/2009, 08h54
  4. problème avec MAX(Date)
    Par ouchemhou dans le forum Langage SQL
    Réponses: 12
    Dernier message: 23/08/2008, 18h13
  5. Problème avec Max.
    Par Tyler Durden dans le forum Langage SQL
    Réponses: 3
    Dernier message: 19/10/2006, 09h05

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