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 avec UPDATE et INNER JOIN


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 100
    Points : 161
    Points
    161
    Par défaut Problème avec UPDATE et INNER JOIN
    Bonjour tout le monde,

    Je suis bloqué sur un problème apparemment tout simple mais très bloquant. Je dois faire des UPDATE joint multiple.

    Je travaille sur un jeu de stratégie en ligne. Chaque village possède une forge qui emploie des groupes de forgerons. Toutes les heures, la "santé" de la forge est diminué du nombre de forgeron travaillant à la forge.

    Imaginons que j'ai deux groupes de forgerons - A et B composés respectivement de 10 et 5 travailleurs - et une forge F - d'une santé de 100.
    Je voudrais par conséquent faire une requête qui sélectionne chaque couple forgerons-forge (soit F-A et F-B) et modifie en fonction la santé de la forge, ce qui doit donner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // santé de départ = 100;
    santé -= 10; // moins le nombre de forgeron A, soit santé = 100 - 10 = 90;
    santé -= 5; // moins le nombre de forgeron B, soit santé = 90 - 5 = 85;
    // santé final = 85.
    J'ai par conséquent codé la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE Batiment b
    INNER JOIN Habitant h ON h.Village_Id = b.Village_Id
    SET b.Sante = b.Sante - h.Travail
    WHERE b.Nom = "Forge" && h.Metier = "Forgeron"
    Malheureusement, cela ne fonctionne pas.

    Santé est invariablement égal à 90.

    Je vois deux possibilités :

    1/ soit la requête ne modifie qu'une seule fois la valeur santé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // santé de départ = 100;
    santé -= 10; // moins le nombre de forgeron A, soit santé = 100 - 10 = 90;
    // n'exécute pas la deuxième modification, soit santé final = 90.
    2/ soit la requête sélectionne d'abord la valeur santé de chaque couple forge-forgeron, et modifie ensuite la santé en partant de la valeur originale. La deuxième modification ne prend ainsi pas en compte la première.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // santé de départ = 100;
    santé -= 5; // moins le nombre de forgeron B, soit santé = 100 - 5 = 85;
    santé -= 10; // moins le nombre de forgeron A, soit santé = 100 - 10 = 90;
    // santé final = 90.
    Petite remarque : la deuxième explication implique que le couple F-B soit traité AVANT le couple F-A, car c'est le résultat de F-A qui est enregistré. Or, si l'on modifie cette requête en SELECT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM Batiment b
    INNER JOIN Habitant h ON h.Village_Id = b.Village_Id
    WHERE b.Nom = "Forge" && h.Metier = "Forgeron"';
    le couple F-A apparaît avant le couple F-B. Cela me pousse à penser que la première explication est peut-être la bonne.

    Avez-vous une idée comment régler cela, car ce type de requête se retrouve dans tous mes crons et, si je ne veux pas tuer mon processeur, je ne peux vraiment pas me permettre de faire à chaque fois un SELECT puis un UPDATE à chaque enregistrement retourné.

    Merci d'avance pour vos réponses, ou au moins d'avoir pris le temps de lire ce message.

    Korbn

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE Batiment b
    INNER JOIN (SELECT SUM(h.Travail) AS retrait, h.Village_Id
    FROM Habitant h
    WHERE  h.Metier = "Forgeron"
    GROUP BY h.Village_Id) AS sr
    ON sr.Village_Id=b.Village_Id
    SET b.Sante = b.Sante - sr.retrait
    WHERE b.Nom = "Forge"
    Peut-être comme ça.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 100
    Points : 161
    Points
    161
    Par défaut
    C'est nickel. Je me coucherais beaucoup moins bête ce soir.

    Merci, merci beaucoup pour le support.


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.4] UPDATE et INNER JOIN problème
    Par laurentbatch dans le forum Langage
    Réponses: 8
    Dernier message: 21/08/2013, 16h33
  2. Problème avec "update" du code ASP
    Par ocean_prince11 dans le forum ASP
    Réponses: 14
    Dernier message: 24/11/2006, 18h56
  3. problème avec update dans h:datatable
    Par rarrou dans le forum JSF
    Réponses: 1
    Dernier message: 03/11/2006, 15h22
  4. problème avec update
    Par chingo dans le forum Requêtes
    Réponses: 7
    Dernier message: 14/10/2006, 23h16
  5. [MySQL] Problème avec UPDATE
    Par oim dans le forum PHP & Base de données
    Réponses: 30
    Dernier message: 22/04/2006, 10h12

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