Précédent   Forum du club des développeurs et IT Pro > 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
 
Outils de la discussion
Publicité
'
Vieux 21/12/2012, 15h53   #1
tintin72
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 616
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 616
Points : 127
Points : 127
Par défaut UPDATE sur plusieurs lignes ?

Bonjour,

Je voudrais faire un UPDATE sur plusieurs lignes avec différentes valeurs pour
chaque ligne, (le but étant de décrémenter la valeur).
Après quelques recherches je suis arrivé à ça:
Code :
1
2
3
4
5
UPDATE `ma_table` SET stock = CASE 
WHEN id = 4 THEN stock = stock - 2 
WHEN id = 6 THEN stock = stock - 1 
END 
WHERE id IN (4,6);
Tout semble fonctionner (MySQL me dit que 2 lignes ont été affectées) SAUF QUE dans la table les valeurs en question restent inchangées.

Quelqu'un pourrait-il m'aider ?

Merci
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2012, 16h15   #2
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 659
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
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 : 13 659
Points : 25 563
Points : 25 563
Envoyer un message via MSN à CinePhil
Dans ta requête, quand id = 4, tu demandes cette opération :
Code :
SET stock = stock = stock - 2
Même opération bizarre pour id = 6

Essaie plutôt comme ça :
Code :
1
2
3
4
5
6
7
UPDATE `ma_table`
SET stock =
	CASE
		WHEN id = 4 THEN (stock - 2)
		WHEN id = 6 THEN (stock - 1)
	END
WHERE id IN (4,6);
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
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 la suite Linux Mageïa !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2012, 17h01   #3
tintin72
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 616
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 616
Points : 127
Points : 127
Salut et merci pour ta réponse.
Malheureusement ça ne fonctionne pas, j'ai l'erreur:
Citation:
#1690 - BIGINT UNSIGNED value is out of range in '(`ma_base`.`ma_table`.`stock` - 2)'
Une idée ?
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2012, 19h52   #4
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 659
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
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 : 13 659
Points : 25 563
Points : 25 563
Envoyer un message via MSN à CinePhil
Que donne la requête suivante ?
Code :
1
2
3
4
5
6
7
SELECT id, 
	CASE
		WHEN id = 4 THEN (stock - 2)
		WHEN id = 6 THEN (stock - 1)
	END AS stock
FROM ma_table
WHERE id IN (4,6)
Quelles valeurs y a t-il actuellement dans stock pour ces id.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
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 la suite Linux Mageïa !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2012, 20h32   #5
tintin72
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 616
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 616
Points : 127
Points : 127
Citation:
Que donne la requête suivante ?
Toujours la même erreur:
Citation:
#1690 - BIGINT UNSIGNED value is out of range in '(`ma_base`.`ma_table`.`stock` - 2)'
Citation:
Quelles valeurs y a t-il actuellement dans stock pour ces id.
15.
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2012, 22h34   #6
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 659
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
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 : 13 659
Points : 25 563
Points : 25 563
Envoyer un message via MSN à CinePhil
De quel type est la colonne stock ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
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 la suite Linux Mageïa !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2012, 22h43   #7
tintin72
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 616
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 616
Points : 127
Points : 127
Citation:
De quel type est la colonne stock ?
INT UNSIGNED
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 15h07   #8
tintin72
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 616
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 616
Points : 127
Points : 127
Ok, j'ai finalement trouvé la bonne syntaxe qui est toute bête:
Code :
1
2
3
4
5
UPDATE `my_table` SET stock = CASE
WHEN id = 4 THEN stock - 2
WHEN id = 6 THEN stock - 1
END
WHERE id IN (4,6);
Maintenant mon problème est que si par exemple la valeur de "stock" est plus
petite que la valeur à enlever, j'obtiens l'erreur:
Citation:
#1690 - BIGINT UNSIGNED value is out of range in '(`ma_base`.`ma_table`.`stock` - 2)'
Il faut donc que j'insert un IF dans ma requête pour dire que si la valeur à enlever est plus grande que stock, alors stock vaut zéro, sinon on effectue la soustraction.

Quelqu'un pourrait-il m'aider pour la syntaxe car je galère pas mal.

Merci
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 17h14   #9
ericd69
Expert Confirmé
 
Avatar de ericd69
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 1 802
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 1 802
Points : 3 096
Points : 3 096
salut,

Code sql :
1
2
3
4
5
UPDATE `my_table` SET stock = CASE
WHEN id = 4 AND stock>=2 THEN stock - 2
WHEN id = 6 AND stock>=1 THEN stock - 1
END
WHERE id IN (4,6);
__________________
soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 17h28   #10
tintin72
Membre habitué
 
Avatar de tintin72
 
Inscription : septembre 2003
Messages : 616
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 616
Points : 127
Points : 127
Merci pour ta réponse.
De mon coté j'ai trouvé une syntaxe qui permet en plus de mettre "stock" à zero si la valeur à extraire est plus grande ou égal à stock:
Code :
1
2
3
4
5
UPDATE `my_table` SET stock = CASE
WHEN id = 4 THEN stock - IF(2 >= stock, stock, 2)
WHEN id = 6 THEN stock - IF(1 >= stock, stock, 1)
END
WHERE id IN (4,6);
tintin72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 22h05.


 
 
 
 
Partenaires

Hébergement Web