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

PHP & Base de données Discussion :

UPDATE et INNER JOIN


Sujet :

PHP & Base de données

  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 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 solution 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 solution 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 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
    Désolé, je me suis aperçu que ce sujet n'avait rien à faire ici, vu que c'est un problème purement MySQL et non de communication entre PHP et MySQL.

    La discussion continue donc sur cette page.

Discussions similaires

  1. REQUETE UPDATE avec INNER JOIN
    Par vero81 dans le forum SQL
    Réponses: 1
    Dernier message: 07/08/2009, 16h45
  2. Problème avec UPDATE et INNER JOIN
    Par korbn dans le forum Requêtes
    Réponses: 2
    Dernier message: 25/05/2009, 20h52
  3. probleme update et inner join
    Par makaphrodite dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/04/2009, 11h44
  4. UPDATE et INNER JOIN
    Par korbn dans le forum Requêtes
    Réponses: 4
    Dernier message: 22/11/2008, 04h28
  5. UPDATE avec INNER JOIN
    Par steelidol dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 03/03/2006, 23h56

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