Updaté les résultats d'un select

Djay
Invité n'ayant pas de compte PHPfrance

02 mars 2006, 17:55

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

Mammouth du PHP | 1029 Messages

03 mars 2006, 17:03

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'
L'expérience est la somme de toutes nos erreurs.

Djay
Invité n'ayant pas de compte PHPfrance

03 mars 2006, 17:32

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

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

04 mars 2006, 02:35

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