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 12/01/2011, 13h08   #1
Membre du Club
 
Inscription : mars 2006
Messages : 71
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 71
Points : 65
Points : 65
Par défaut Problème avec un UPDATE + SUM

Bonjour,

Mes connaissance en SQL sont assez anciennes et malgré la documentation de developpez.com, je n'arrive pas à résoudre mon problème :

Table contenant des entrées (user, type (ENTIER), valeur (ENTIER)) :
Code :
1
2
3
4
5
6
7
8
 
user | type | valeur
Toto, 1, 4
Toto, 2, 7
Toto, 3, 1
Titi, 1, 5
Titi, 2, 0
Titi, 3, 0
Mon objectif est de sommer par user les valeurs de type 1 et 2 et d'affecter cette somme à la valeur de type= 3, soit :
Code :
1
2
3
4
5
6
7
8
 
user | type | valeur
Toto, 1, 4
Toto, 2, 7
Toto, 3, 11  <--
Titi, 1, 5
Titi, 2, 0
Titi, 3, 5  <--
J'arrive à obtenir la somme des valeurs, affichée par user :
Code :
1
2
3
4
SELECT `user`, SUM(`valeur`) AS s 
FROM `table` 
WHERE `type` IN (1,2) 
GROUP BY `user` ;
Je "sais" affecter une valeur à une entrée :
Code :
1
2
3
UPDATE `user` 
SET `valeur`= 1 
WHERE `type`= 3
Mais je n'arrive vraiment pas à faire le lien entre ces deux requêtes... (en mySQL).

Si vous pouviez me mettre dans la bonne direction ?
Nil_ct est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 14h05   #2
Membre du Club
 
Inscription : octobre 2009
Messages : 59
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 59
Points : 69
Points : 69
Code :
UPDATE `table` t SET t.`valeur`= (SELECT SUM(`valeur`) FROM `table` t2 WHERE t2.`type` IN (1,2) AND t2.user = t.user GROUP BY t2.`user`) WHERE t.`type`= 3
En gros c'est ça
The zxeno prophet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 14h07   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 985
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 985
Points : 18 232
Points : 18 232
Envoyer un message via MSN à CinePhil
Il faut passer par une table temporaire car MySQL refusera de modifier la table sur laquelle est basée le calcul.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
CREATE TEMPORARY TABLE tmp
SELECT user, SUM(valeur) AS s
FROM la_table
WHERE type IN (1, 2)
GROUP BY user;
 
UPDATE la_table t
INNER JOIN tmp ON tmp.user = t.user
SET t.valeur = tmp.s
WHERE type = 3;
 
DROP TABLE tmp;
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 14h51   #4
Membre du Club
 
Inscription : mars 2006
Messages : 71
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 71
Points : 65
Points : 65
Merci CinePhil !

c'est impec et cela va probablement beaucoup m'aider par la suite (table temporaire et INNER JOIN).
Nil_ct 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 20h04.


 
 
 
 
Partenaires

Hébergement Web