IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

problème update multi-tables


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 7
    Points : 9
    Points
    9
    Par défaut problème update multi-tables
    Bonjour,

    J'ai trois tables:

    produit
    --------------
    id
    prix
    stock

    commandes
    --------------
    id
    date
    etat (0=>non validée, 1=>validée)

    commande_produit
    --------------
    id
    id_produit
    id_commande
    quantite

    plusieurs commandes peuvent donc contenir un même produit

    Je souhaite réincrémenter le stock des produits qui avaient été commandés mais dont la commande n'a pas été validée et étant assez ancienne.
    Lorsque j'exécute la requête update multi-tables:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    update
      commande
        left join
      commande_produit on commande.id = commande_produit.id_commande
        left join
      produit on commande_produit.id_produit = produit.id
    set
      produit.stock =
        produit.stock + commande_produit.quantite
    where
      commande.date < '2009-10-01' and
      etat = 0
    si un produit figure sur plusieurs commandes, le stock n'est réincrémenté que pour une seule commande à chaque fois. On dirait que l'update multi-tables ne peut pas intervenir plusieurs fois sur un même enregistrement...

    Quelqu'un a-t-il déjà eu ce cas ?

    Merci

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    si un produit figure sur plusieurs commandes, le stock n'est réincrémenté que pour une seule commande à chaque fois. On dirait que l'update multi-tables ne peut pas intervenir plusieurs fois sur un même enregistrement...
    Ca me semble tout à fait normal !
    Un produit n'existe qu'une fois dans la table à "UPDATEr" donc son stock n'est mis à jour qu'une seule fois.
    Ne pas se méprendre non plus sur "l'update multi-tables" ! On ne peut mettre à jour qu'une seule table à la fois, sauf avec un mécanisme de trigger.

    Je souhaite réincrémenter le stock des produits qui avaient été commandés mais dont la commande n'a pas été validée et étant assez ancienne.
    Si je comprends bien, et d'après votre requête, vous souhaitez ajouter à produit.stock la somme des quantités de produits commandés avant le 01/10/2009 et non livrés (etat = 0).

    Avant de faire un UPDATE, il vaut mieux commencer par un SELECT pour ne pas faire n'importe quoi avec les données.
    Quels sont les produits commandés avant le 01/10/2009 et non livrés ainsi que la somme des quantités commandées par produit ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT p.id, SUM(cp.quantite) AS QteCommandee
    FROM produit AS p
    INNER JOIN commande_produit AS cp ON p.id = cp.id_produit
      INNER JOIN commande AS c ON cp.id_commande = c.id
    WHERE c.dateCommande < '2009-10-01'
      AND c.etat = 0
    GROUP BY p.id
    Au passage, j'ai corrigé le nom de la colonne 'date' en 'dateCommande' parce que 'date' est un mot réservé SQL.

    Maintenant on peut essayer le UPDATE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    UPDATE produit
    INNER JOIN (
      SELECT p.id, SUM(cp.quantite) AS QteCommandee
      FROM produit AS p
      INNER JOIN commande_produit AS cp ON p.id = cp.id_produit
        INNER JOIN commande AS c ON cp.id_commande = c.id
      WHERE c.dateCommande < '2009-10-01'
        AND c.etat = 0
      GROUP BY p.id
    ) AS temp ON produit.id = temp.id
    SET produit.stock = produit.stock + temp.QteCommandee
    Il est toutefois possible que MySQL refuse de mettre à jour une table qu'il interroge en même temps dans la sous-requête, auquel cas il faut passer par une table temporaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TEMPORARY TABLE temp
    SELECT p.id, SUM(cp.quantite) AS QteCommandee
    FROM produit AS p
    INNER JOIN commande_produit AS cp ON p.id = cp.id_produit
      INNER JOIN commande AS c ON cp.id_commande = c.id
    WHERE c.dateCommande < '2009-10-01'
      AND c.etat = 0
    GROUP BY p.id;
     
    UPDATE produit
    INNER JOIN temp ON produit.id = temp.id
    SET produit.stock = produit.stock + temp.QteCommandee
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 !

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 7
    Points : 9
    Points
    9
    Par défaut Merci
    Merci CinePhil,

    J'ai effectivement opté pour le code que tu as indiqué en seconde partie. Par contre j'utilise souvent le nom Date pour certains champs, et cela ne m'a jamais posé de problème.

Discussions similaires

  1. [AC-2003] problème update de table VBA vers table oracle
    Par valmelissa dans le forum VBA Access
    Réponses: 10
    Dernier message: 29/10/2009, 12h39
  2. Un UPDATE multi-table
    Par Séb. dans le forum Requêtes
    Réponses: 5
    Dernier message: 17/07/2008, 03h51
  3. Problème update des tables
    Par PC81 dans le forum VBA Access
    Réponses: 9
    Dernier message: 15/04/2008, 11h10
  4. Problème DELETE multi-tables
    Par Gwipi dans le forum Requêtes
    Réponses: 5
    Dernier message: 22/05/2006, 08h48
  5. UPDATE multi-tables sous SQL Server
    Par Cybernet dans le forum Langage SQL
    Réponses: 8
    Dernier message: 25/03/2004, 15h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo