Page 1 sur 1

Updaté les résultats d'un select

Posté : 02 mars 2006, 17:55
par Djay
Bonjour,

J'aurai voulu savoir s'il était possible d'effectuer un UPDATE via une sous-requête SELECT ?

Comme il est possible de faire avec le INSERT (INSERT INTO table (champ) SELECT ...)




:arrow: Je m'explique :

J'ai les tables suivantes :

article (id_article, nom, quantite)
commande (id_commande, id_client)
produit_commande (id_article, id_commande, quantite) qui fait la liaison entre les commandes et les produits commandés

Je souhaite lors de la suppression d'une commande, remettre à jour la quantité de mes produits présents dans la table produit.

Voici mon SELECT qui me selectionne l'id_prod et la quantité de chaques produit présents dans la table produit_commande correpondant à l'id_commande du client.

Code : Tout sélectionner

SELECT C.id_com, P.id_article, P.qte FROM CLIENT AS CL LEFT JOIN commande AS C ON CL.id_client = C.id_client LEFT JOIN produit_commande AS P ON C.id_com = P.id_com LEFT JOIN article AS A ON P.id_article = A.id_article WHERE CL.id_client = 'ID_CLIENT' AND C.id_com = 'ID_COMMANDE'
et le UPDATE serait de la forme :

Code : Tout sélectionner

UPDATE article SET quantite = quantite + 'QTE_DU_SELECT' WHERE id_article = 'ID_ARTICLE_DANS_COMMANDE'
Ca se trouve c'est impossible (en une seule requête) ? :P

Merci d'avance

Posté : 03 mars 2006, 17:03
par Maitrepylos
Ceci ne fonctione pas ?

Code : Tout sélectionner

UPDATE article SET quantite = quantite + (SELECT C.id_com, P.id_article, P.qte FROM CLIENT AS CL LEFT JOIN commande AS C ON CL.id_client = C.id_client LEFT JOIN produit_commande AS P ON C.id_com = P.id_com LEFT JOIN article AS A ON P.id_article = A.id_article) WHERE CL.id_client = 'ID_CLIENT' AND C.id_com = 'ID_COMMANDE') WHERE id_article = 'ID_ARTICLE_DANS_COMMANDE'

Posté : 03 mars 2006, 17:32
par Djay
Malheureusement non :(

J'ai essayer avec une requête de base :

Code : Tout sélectionner

UPDATE article SET quantite = quantite + (SELECT quantite FROM article WHERE id_article = '9') WHERE id_article = '3'
Donc, augmente le stock du produit 3 d'une quantité égale au stock du produit 9.

Mais ça ne fonctionne pas.

Je crois que c'est tout simplement impossible

Posté : 04 mars 2006, 02:35
par Hubert Roksor
Je n'ai pas compris pourquoi tu faisais un JOIN sur la table des clients mais à priori, la requête que tu recherches devrait ressembler à ça:

Code : Tout sélectionner

UPDATE commande c, produit_commande pc, article a SET a.quantite = a.quantite - pc.qte WHERE c.id_com = @ID_COMMANDE AND pc.id_com = c.id_com AND a.id_article = pc.id_article
...où @ID_COMMANDE est l'ID de la commande à effacer. Attention quand même à t'assurer que deux requêtes identiques ne sont pas exécutées en même temps. Sous InnoDB (que je recommande pour ce genre de tâches et partout où de l'argent est en jeu) tu peux vérouiller les enregistrements en question avec SELECT ... FOR UPDATE

Les UPDATE multi-table sont extrêmements similaires à un SELECT multi-table (à part quelques restrictions), si t'arrives à faire un SELECT qui sélectionne toutes les données dont tu as besoin c'est que tu n'es pas très loin d'avoir l'UPDATE correspondant. Voir UPDATE Syntax: Multiple-table syntax