Problème SQL

Résolu
Bonjour,

J'ai une table avec des enregistrements

user - date connexion - score
greg1 - 20071112 - 50
greg1 - 20071113 - 60
greg2 - 20071115 - 70
greg2 - 20071115 - 80

Je voudrais récupérer pour chaque user la ligne du meilleur score, comment faire?

j'ai essayé avec les distinct, mais ca ne fonctionne pas
j'ai essayé avec le having aussi mais sans succès.

Si quelqu'un a une piste ou la réponse, je suis preneur.

D'avance merci
Configuration: Windows XP
Firefox 2.0.0.9

13 réponses

Résumé de la discussion

Pour récupérer pour chaque utilisateur la ligne du meilleur score dans une table comportant user, date_connexion et score, il faut viser le max des scores par utilisateur. La solution courante consiste à utiliser MAX(score) avec GROUP BY user, ce qui renvoie le meilleur score par utilisateur mais pas nécessairement la ligne complète (date associée). Pour récupérer aussi la date et les autres champs, il faut joindre le résultat au tableau initial ou employer des fonctions de fenêtre (WINDOW) si votre SGBD les supporte. Attention aux cas de valeurs identiques et aux éventuels doublons: plusieurs lignes peuvent partager le même score maximal et il faut définir un critère de tri ou de sélection.

Bobot (l’IA à votre service)
  1. Bonjour,

    Select max(score) From myTable Where User = 'myUser'

    ;o)

    Polux
    1. Contributeur
      Pour résoudre ce problème il faut utilisé la fonction Max donc on oura la requêtte SQL suivante:

      SELECT user, Max(score) AS MeilleureScore
      FROM table1
      GROUP BY user;

      1. Oupsss très juste ZOUARI, moi je n'ai que le meilleur score d'un user ... j'avais pas bien tout lu ...

        ;o)

        Polux
        1. Bonjour,

          Merci de vos réponses mais dans ce cas, je n'ai pas la date a laquelle il a réaliser ce meilleur score !!
          et si je rajoute

          select user, date_connexion, Max(score)
          from table1
          group by user, date_connexion


          ben la j'ai mon tableau entier qui ressort !

          D'autres idées?
          1. Plop, essaye ça :

            Select user, date_connexion, max(score) as MeilleurScore
            from table1
            group by user
            1. Merci orionz pour ta réponse,

              cependant ca me génère une erreur disant que date_connexion n'est pas valable car il n'est pas dans une fonction d'agrégation ou dans une clause group by.
              Et quand je le met dans le group by, j'ai toute les lignes qui ressortent.

              je me demande si c'est possible!

              si niais : grecoriz
              1. plop, j'ai vérifié, voila ce que j'obtiens :

                création de la table, avec tes enregistrements :

                CREATE TABLE `table1` (
                `user` VARCHAR( 20 ) NOT NULL ,
                `date_connexion` VARCHAR( 20 ) NOT NULL ,
                `score` INT NOT NULL
                );

                INSERT INTO `table1` ( `user` , `date_connexion` , `score` )
                VALUES ('greg1', '20071112', '50'),
                ('greg1', '20071113', '60'),
                ('greg2', '20071115', '70'),
                ('greg2', '20071115', '80');

                requete pour récuperer le meilleur score pour chaque user :

                SELECT user, date_connexion, max( score ) AS MeilleurScore
                FROM table1
                GROUP BY user
                LIMIT 0 , 30

                résultats de la requete :


                user - date_connexion - MeilleurScore
                greg1 20071112 60
                greg2 20071115 80

                ca marche donc chez moi, tu peux me dire ce que tu obtiens avec la meme démarche ?
                1. salut orionz750
                  je sais pas ou te contacter c est pour ca que je fais ca par le biais de ce site ou j ai pour habitude de venir observer tes réponses que je toruvent si pertientes et ta générosité envers les autres.
                  aprés des années passées en cachette je te le déclare en fin: JE T AIME. je ne voulais pas paraitre ridicule et n osais te poser de questions de peur de paraitre sote mais aujourd hui je passe enfin a l act.je ne suis pas geekette c est pour ca que j ai commencé a fréquenter ce site mais j e t ai déocuvert et dessuite est tombée sous le charme. accepterais tu de me rencontre si par chance tu habites a bordeaux je dirai a tout hasar allées des chartres ce jeudi a 12H?? j en serais vraiment toute émoustillée. merci d avance pour ta réponse tant attendue
                2. trop top ... c'est la premiere fois que je vois ça ...

                  Le premier mariage sur CCM en vue ???
              2. Bloc note : * Penser à demande un forum Agence Matrimoniale ...

                Bravo Léa, belle déclaration ... ça règle pas le problème de grecoriz, mais c'est beau ... bonne chance à toi

                ;o)

                Polux
                1. Va y avoir du monde demain à midi sur les allées de chartres à Bordeaux ....

                  ;o)
                  1. @ShaBooBonjour,
                    merci de votre soutien ce n est pas facil pour moi de me déclarer. et aussi merci de me faire penser a une petite description pour se reconaitre. je porterai un bonnet blanc et une echarpe noir rien de bien spéciale mais ca sufira. je suis assez petite cheuveux mi longs. je suis dsl de "squatter" votre forum pour des questions autre qu informatique mais c est tres important pour moi. et oui, prq pas un forum 'rencontres' ca serait bien util^^ et PS: orionz750 je modifie le lieu de rdv. je t attendrai allées de tourny leiu plus connu et plus facile pr toi a repérer. a demain j espere vraiment te voir
                2. Hé les gars, c'est pas allées de chartres ... c'est allées de tourny maintenant, même heure ... bonnet blanc et écharpe noire ... c'est noté ...
                  1. et pour ceux qui savent pas ou cela se trouve, c'est ici

                    ;p
                3. chatain mais détrompez vous je saurai reconnaitre orionz750 parmi tant d autres. je ne te connais pas ms j ai l impression d etre si proche de toi que je pourrai te reconaitre sans mm t avoir vu. imposteurs abstenez vous!!
                  1. zut ... je voulais venir avec mon arrosoir

                    ;p
                4. noulish xD

                  avant de commencer dsl grecoriz de pourrir ton post mais il le faut (préviens moi quand meme si la requete marche) :p
                  arf ca l'aurait fait si ca aurait été vrai et qu'on se soit rencontré comme ca mais ca existe que dans les films tout ca ^^
                  désolé pour tous ceux qui y ont cru mais je la connais...c'est ma copine depuis 5ans en fait -_-' mais bon jtrouve ca classe ta ptite attention chou
                  pas de pb ma puce on mange ensemble demain comme d'hab, d'ailleurs si des gens veulent se joindre à nous (bah ouais, tu fais ta trollette (jtexpliquerai ce que c'est), t'assumes), ca sera bien à midi allées de tourny et elle à pas menti en se décrivant, par contre oubliez le bonnet blanc (pas moyen que tu le mettes demain). et les filles de CCM, hésitez pas a prendre exemple :p

                  bonne soirée
                  1. pas de prob ... j'y serais ;p
                  2. @ShaBoook le rdv est prit alors disons devant l enseigne de thomas cook voyages. ue non pas de bonnet mais une petite ac un skateur c est nous:) a demain
                  3. Bonjour,

                    Non pas de problème pour ces petites attentions, c'est plutôt bien.

                    Sinon, lorsque je fais cette requête

                    SELECT user, date_connexion, max( score ) AS MeilleurScore
                    FROM table1
                    GROUP BY user


                    J'ai ce message d'erreur

                    La colonne 'table1.date_connexion' n'est pas valide dans la liste de sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation ou dans la clause GROUP BY.

                    Et lorsque je rajoute le group by, je lance donc cette requête (j'ai mis user

                    SELECT user, date_connexion, max( score ) AS MeilleurScore
                    FROM table1
                    GROUP BY user, date_connexion


                    et j'obtiens comme résultat :


                    greg1 20071112 50
                    greg1 20071113 60
                    greg2 20071115 80

                    ca marche quand la date est la meme mais pas pour greg1 ou on a deux dates différentes.

                    Je précise quand même que je suis sous sql server 2000.

                    Merci merci et "bon appétit"
                  4. @grecorizBonjour,

                    As tu essayé ceci :

                    SELECT user, date_connexion, max( score ) AS MeilleurScore
                    FROM table1
                    GROUP BY user, date_connexion
                    HAVING max( score )
                    ORDER BY user
                  5. @ShaBooMerci Shaboo, mais malheureusement, il n'a pas l'air d'aimé le having max(score) sans rien derrière.

                    A Bientôt

                    ^_^
                    grecoriz
                5. wazaaaaa

                  J'ai trouvé !!
                  Il y a peut être plus élégant mais pour l'instant ca marche,

                  voila la requete que j'ai lancé :

                  SELECT t1.user, t1.date_connexion, t1.score
                  FROM table1 t1, (select t1bis.user, max(t1bis.score) as MeilleurScore from table1 t1bis GROUP BY t1bis.user) t2
                  where t1.user = t2.user
                  and t2.meilleurscore = t1.score


                  et le résultat tant attendu

                  greg2 20071116 90
                  greg1 20071113 60


                  PS : j'avais rajouté un enregistrement et j'avais ces données en base :
                  greg1 20071112 50
                  greg1 20071113 60
                  greg2 20071115 70
                  greg2 20071115 80
                  greg2 20071116 90


                  Merci en tout cas, il ne me reste plus qu'a transcrire à mon cas qui est légèrement plus complexe.

                  A bientot et tous mes voeux de bonheur à orionz et lea star !!! et encore et toujours bon appétit( c'est important)