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 :

Incrément sur une table selon groupe de valeurs ?


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut Incrément sur une table selon groupe de valeurs ?
    Bonjour,

    J'ai une table sous MySQL 5.0 avec les infos suivantes :

    table_a
    id INT AUTO_INCREMENT PRIMARY KEY,
    val1 INT,
    val2 INT,
    classement INT

    Qui donne par exemple :
    id___val1___val2_______classement
    1____1______35________NULL
    2____1______40________NULL
    3____1______70________NULL
    4____2______120_______NULL
    5____2______6_________NULL
    6____2______780_______NULL

    Je souhaite updater le champ 'classement' initialement à NULL par un compteur, qui prend les données dans l'ordre de la table (elle ont été triée à l'avance) et s'incrémente selon le 'groupe' de valeurs de 'val1', exemple:

    id___val1___val2_______classement
    1____1______35________1
    2____1______40________2
    3____1______70________3
    4____2______120_______1
    5____2______6_________2
    6____2______780_______3

    Sauriez-vous comment faire ceci ?

    En vous remerciant,

    C. Tobini

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 739
    Points
    11 739
    Par défaut
    au passage il ne s'agit pas de l'ordre de la table ("il n'y a pas plus d'ordre des lignes dans une table que d'ordre des billes dans un sac") mais de l'ordre croissant des id.

    Pour faire cela, il faut partir du principe que le classement d'une ligne est le nombre de lignes inférieures, plus elle-même. Autrement dit, je suis la troisième ligne s'il y en a deux avant moi.

    Le truc consiste donc à placer en face de chaque ligne les lignes de même groupe et d'id inférieure ou égale, et à les compter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T1.id, COUNT(*) AS Classement
    FROM table_a T1
      INNER JOIN table_a T2 ON T2.val1 = T1.val1 AND T2.id <= T1.id
    GROUP BY T1.id, T1.val1, T1.val2
    Mettons maintenant tout ça dans un UPDATE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE table_a T1
    SET classsement = (SELECT COUNT(*) 
      FROM (SELECT id, val1 FROM table_a) T2
      WHERE T2.val1 = T1.val1 AND T2.id <= T1.id
      )
    Le niveau supplémentaire de sous-requête, inutile en théorie, est rendu nécessaire par MySQL qui refuse d'écrire sur la table qu'il met à jour... la sous-requête dans le FROM sera implémentée par une table temporaire, du coup on lit sur une autre table.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut
    Bonjour et merci beaucoup pour cette solution qui marche impeccablement !

    Bon week-end,

    C. Tobini

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

Discussions similaires

  1. [MySQL-5.6] Faire une requête sur deux tables pour avoir la valeur MAX sans le GROUP BY
    Par emykev22 dans le forum Requêtes
    Réponses: 1
    Dernier message: 04/06/2014, 13h12
  2. Réponses: 2
    Dernier message: 21/10/2013, 16h50
  3. Réponses: 4
    Dernier message: 16/01/2009, 15h30
  4. recuperer valeur d'une table selon un id
    Par jackboy dans le forum Requêtes
    Réponses: 2
    Dernier message: 04/10/2007, 09h37
  5. Boucler sur une table pour renommer des valeurs
    Par webwhisky dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 03/01/2006, 15h19

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