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 :

Classement et position


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 24
    Par défaut Classement et position
    Bonsoir,

    voila j ai un petit truc a faire dans une de mes table mysql mais je ne suis pas trop sur de comment m y prendre

    Donc j ai une table avec entre autres, 3 colonnes , userid et une autre points et points bonus

    J aimerai automatiquement en SQL , mettre a jour une autre colonne classement , qui attribue a mes users un chiffre , qui correspond a leur classement au nombre de points ( du plus grand nombre au plus petit ) .Petite particularité, en cas d egalité au nombre de points , c est le nombre de points bonus qui départage mes users.

    Cette colonne "classement" me serait utile ensuite , pour calculer la différence entre le classement actuel ( celui de la toute derniere mise a jour ) , et le classement de l avant derniere mise a jour.

    en gros ça donnerai ça quoi
    USERID POINTS POINTSBONUS CLASSEMENT
    ------ -------- -------------- ------------
    TOTO 23 2 1
    TITI 20 10 3
    TRONCHE 23 1 2
    MOMO 12 0 4
    ...



    Je pourrai faire ça en PHP , mais je veux pas faire dans l usine a gaz, et je ne connais pas encore tres bien toutes les possibilités de SQL.

    Je vous remercie d avance si vous pouvez me sortir de la !

  2. #2
    cdu
    cdu est déconnecté
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2004
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 196
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select userid, points,pointsbonus from table order by points, pointsbonus
    ça convient?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 24
    Par défaut
    Oui et non !

    - oui car effectivement ça me sort un resultat dans l ordre que je veux . Si je voulai faire que de l affichage , je me contenterai de cette commande

    - Non , car j aimerai que les positions dans le classement soit mis a jour dans une autre colonne classement de ma table.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    Simplissime...

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    CREATE TABLE T_SCORE
    (USERID       VARCHAR(16),
     POINTS       INT,
     POINTSBONUS  INT);
     
    INSERT INTO T_SCORE VALUES ('TOTO',    23, 2);
    INSERT INTO T_SCORE VALUES ('TITI',    20, 10);
    INSERT INTO T_SCORE VALUES ('TRONCHE', 23, 1);
    INSERT INTO T_SCORE VALUES ('MOMO',    12, 0);
     
    CREATE VIEW V_SCORE
    AS
       SELECT USERID, 
              POINTS + CAST(POINTSBONUS AS FLOAT) 
              / CAST((SELECT MAX(POINTSBONUS) + 1 FROM T_SCORE) AS FLOAT) AS SCORE
       FROM   T_SCORE;
     
    SELECT *
    FROM   V_SCORE;
     
    USERID           SCORE                                                 
    ---------------- ------------------
    TOTO             23.181818181818183
    TITI             20.90909090909091
    TRONCHE          23.09090909090909
    MOMO             12.0
     
    SELECT T1.USERID, T1.SCORE, COUNT(*) AS RANG
    FROM   V_SCORE T1
           INNER JOIN V_SCORE T2
                 ON T1.USERID <= T2.USERID
    GROUP BY T1.USERID, T1.SCORE
     
    USERID           SCORE              RANG        
    ---------------- ------------------ ----------- 
    MOMO             12.0               4
    TITI             20.90909090909091  3
    TRONCHE          23.09090909090909  1
    TOTO             23.181818181818183 2
     
     
    -- la requête sans la vue  :
     
    SELECT T1.USERID, T1.SCORE, COUNT(*) AS RANG
    FROM   (SELECT USERID, 
                   POINTS + CAST(POINTSBONUS AS FLOAT) 
                   / CAST((SELECT MAX(POINTSBONUS) + 1 FROM T_SCORE) AS FLOAT) AS SCORE
            FROM   T_SCORE) T1
           INNER JOIN (SELECT USERID, 
                              POINTS + CAST(POINTSBONUS AS FLOAT) 
                              / CAST((SELECT MAX(POINTSBONUS) + 1 FROM T_SCORE) AS FLOAT) AS SCORE
                       FROM   T_SCORE) T2
                 ON T1.USERID <= T2.USERID
    GROUP BY T1.USERID, T1.SCORE
     
    -- beaucoup plus simple encore en SQL 2003 avec les fonctions de fenêtrage :
     
    SELECT *, RANK() OVER(ORDER BY POINTS, POINTSBONUS) AS RANG
    FROM   T_SCORE
     
    USERID           POINTS      POINTSBONUS RANG
    ---------------- ----------- ----------- --------------------
    MOMO             12          0           1
    TITI             20          10          2
    TRONCHE          23          1           3
    TOTO             23          2           4
    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/ * * * * *

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 24
    Par défaut
    Waou !

    Merci t es un chef !! C'est m a l air d etre tout a fait ça ! Je voulai faire une vue ensuite , et tu me la sors d un seul coup c est super . Maintenant je vais essayer de bien comprendre la syntaxe

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

Discussions similaires

  1. Position dans un classement à chaque passage de checkpoint ?
    Par supergrey dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 13/04/2010, 16h04
  2. [MySQL] Obtenir la position d'un classement
    Par matto10 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 24/01/2009, 16h16
  3. [Tableaux] Récupérer rang/position d'un classement
    Par mayers dans le forum Langage
    Réponses: 2
    Dernier message: 17/08/2007, 15h40
  4. [SQL] Connaitre la position d'une ligne dans un classement
    Par Invité dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 27/02/2007, 09h45
  5. [MySQL] Récuperer la position dans un classement
    Par NicoMX dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 21/11/2006, 17h58

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