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 d'incrémentation sur le résultat d'une requête


Sujet :

Requêtes MySQL

  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2013
    Messages : 47
    Par défaut Problème d'incrémentation sur le résultat d'une requête
    Bonjour à toute et tous.

    Voilà j'ai une requête qui se termine par un ORDER BY valeur1, valeur 2, rand().
    L'ordre de sortie est essentiel, il s'agit d'une la liste de gagnants, et le résultat que j'obtiens est conforme à mes attentes.
    Quelques administrateurs peuvent télécharger ces données et les intégrer dans un tableau excel, seulement, et ils sont libres de trier par nom ou par n'importe quel autre champ, à partir de ce moment le classement initial est perdu.
    Je souhaite pouvoir rajouter une colonne virtuelle "classement" allant de 1 à n au résultat obtenu.

    Merci pour votre aide.

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 633
    Billets dans le blog
    10
    Par défaut
    Si vous avez la version 8 de MySQL, vous pouvez utiliser la fonction RANK() ou DENSE_RANK() pour calculer le classement

    Sinon si vous connaissez déjà ce rang, affectez le manuellement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SET @rang=0
    ; 
    SELECT @rang:=@rang+1 AS Rang
         , Col1
         , Col2
         , ... 
         , Coln
    FROM Ma_Table

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2013
    Messages : 47
    Par défaut
    Bonsoir,

    Merci pour votre réponse.
    J'avais déjà essayé d'intégrer une variable, seulement voilà au vue des résultats obtenus, il me semble que MySQL calcule la requête puis ensuite lui applique filtre et autre tri, ce qui fait que ma variable finalement se retrouve également triée... Je vais essayer les fonctions RANK, je reviens vers vous très vite.

    Merci pour votre aide.

  4. #4
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 914
    Par défaut
    Salut

    Je suis sous mysql 8.0.4-rc. Voici un exemple pour illustrer l'usage de la fonction DENSE_RANK().
    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
    68
    69
    70
    71
    72
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
        DEFAULT CHARACTER SET `latin1`
        DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    CREATE TABLE `test`
    ( `id`       INTEGER UNSIGNED  NOT NULL auto_increment PRIMARY KEY,
      `pseudo`   VARCHAR(255)      NOT NULL,
      `point`    INTEGER UNSIGNED  NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `test` (`pseudo`,`point`) VALUES
      ('un',15),('deux',35),('trois',12),('un',8),('trois',25),('deux',35),('trois',2)
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+--------+-------+
    | id | pseudo | point |
    +----+--------+-------+
    |  1 | un     |    15 |
    |  2 | deux   |    35 |
    |  3 | trois  |    12 |
    |  4 | un     |     8 |
    |  5 | trois  |    25 |
    |  6 | deux   |    35 |
    |  7 | trois  |     2 |
    +----+--------+-------+
    --------------
    SELECT    pseudo,
              sum(point) as point,
              dense_rank() over (order by sum(point) desc) as rang
        FROM  test
    group by  pseudo
    --------------
     
    +--------+-------+------+
    | pseudo | point | rang |
    +--------+-------+------+
    | deux   |    70 |    1 |
    | trois  |    39 |    2 |
    | un     |    23 |    3 |
    +--------+-------+------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    @+

Discussions similaires

  1. [MySQL] Problème lors du parcours du résultat d'une requête
    Par rinuom99 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 19/03/2008, 22h44
  2. Effectuer une opération sur le résultat d'une requête
    Par egg3774 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 13/03/2008, 14h29
  3. Requête sur les résultats d'une requête
    Par kiro57 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 17/10/2007, 17h48
  4. Réponses: 2
    Dernier message: 30/08/2007, 23h03
  5. [Etat] Basé sur le résultat d'une requête
    Par Pascal26 dans le forum WinDev
    Réponses: 13
    Dernier message: 12/04/2007, 09h04

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