Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/05/2011, 14h56   #1
Nouveau Membre du Club
 
Inscription : mai 2005
Messages : 61
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2005
Messages : 61
Points : 30
Points : 30
Par défaut Requête update avec SUM

Bonjour,
Soit ma table :
Code :
TABLE (Id, Nom, Nb, Poids);
Je souhaite faire la requête de mise à jour suivante :
Code :
UPDATE TABLE  SET Poids = Nb/SUM(Nb);
Ce qui ne marche évidement pas.
Des idées?
stos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 17h36   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Ca représente quoi sum(nb), c'est la somme totale des nb de la table ?
Code :
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 :
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.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2011, 14h53   #3
Nouveau Membre du Club
 
Inscription : mai 2005
Messages : 61
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2005
Messages : 61
Points : 30
Points : 30
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.
stos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2011, 15h41   #4
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
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 :
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)
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2011, 15h50   #5
Nouveau Membre du Club
 
Inscription : mai 2005
Messages : 61
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2005
Messages : 61
Points : 30
Points : 30
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.
stos est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h21.


 
 
 
 
Partenaires

Hébergement Web