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 :

Requête update avec SUM


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 74
    Par défaut Requête update avec SUM
    Bonjour,
    Soit ma table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Table (Id, Nom, Nb, Poids);
    Je souhaite faire la requête de mise à jour suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE Table  SET Poids = Nb/SUM(Nb);
    Ce qui ne marche évidement pas.
    Des idées?

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Ca représente quoi sum(nb), c'est la somme totale des nb de la table ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update table set poids = nb/(select sum(nb) from table)
    Attention à la division par NULL ou 0 mais je crois que mysql est très laxiste sur ces erreurs, à vérifier...

    Une autre approche normalement plus rapide car le calcul de la somme est effectué une fois et pas pour chaque ligne (mais je ne suis pas sûr de la syntaxe):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update table t
     cross join (select sum(nb) as sum_nb from table) s
       set t.poids = t.nb/s.sum_nb
    Sinon toujours se demander la pertinence de stocker une valeur calculée, car évidemment il faut maintenir cette valeur.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 74
    Par défaut
    oui, en effet, SUM(Nb) correspond à la somme du champs Nb pour toute la table.
    Il me semble que les requêtes que tu me proposes ne marchent pas car MySQL ne tolère pas qu'on écrive un select sur la table qui est mise à jour.
    D' où mon problème...

    Reste évidement la solution de faire deux requêtes, mais je voudrais savoir si c'est possible de n'en faire qu'une.

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    As tu testé les requêtes proposées ? Apparemment la 1ère tombe dans le cas que tu décris mais pas la 2eme :
    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
    mysql> select * from t;                                                                                                                 
    +------+------+------+-------+                                                                                                          
    | Id   | Nom  | Nb   | Poids |                                                                                                          
    +------+------+------+-------+                                                                                                          
    |    1 | toto |    5 |  NULL |                                                                                                          
    |    1 | toto |   10 |  NULL |                                                                                                          
    |    1 | toto |   15 |  NULL |                                                                                                          
    +------+------+------+-------+
    3 rows in set (0.00 sec)
     
    mysql> UPDATE t
        ->  CROSS JOIN (SELECT sum(nb) AS sum_nb FROM t) s
        ->    SET t.poids = t.nb/s.sum_nb;
    Query OK, 3 rows affected (0.00 sec)
    Rows matched: 3  Changed: 3  Warnings: 0
     
    mysql> select * from t;
    +------+------+------+----------+
    | Id   | Nom  | Nb   | Poids    |
    +------+------+------+----------+
    |    1 | toto |    5 | 0.166667 |
    |    1 | toto |   10 | 0.333333 |
    |    1 | toto |   15 |      0.5 |
    +------+------+------+----------+
    3 rows in set (0.00 sec)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 74
    Par défaut
    Merci pour ta persévérance, m'étant fait rembarrer un nombre incalculable de fois par MySQL, j'ai réagit sans tester
    Reste que c'est une astuce drôlement maline à mon goût.

Discussions similaires

  1. Requête UPDATE avec jointure
    Par petburn dans le forum SQL
    Réponses: 7
    Dernier message: 30/07/2007, 14h22
  2. Réponses: 5
    Dernier message: 10/07/2006, 12h05
  3. Requête UPDATE avec variables...
    Par yokyok dans le forum Outils
    Réponses: 2
    Dernier message: 18/05/2006, 10h37
  4. Réponses: 3
    Dernier message: 22/12/2005, 17h47
  5. [VB.NET] [ODBC] Pb requête UPDATE avec clé primaire..?
    Par Pleymo dans le forum Windows Forms
    Réponses: 7
    Dernier message: 09/03/2005, 18h46

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