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 :

UPDATE multiple avec jointure [Fait]


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2003
    Messages : 113
    Points : 137
    Points
    137
    Par défaut UPDATE multiple avec jointure
    Bonjour,

    je souhaite faire un UPDATE sur ces deux tables (version 4.1.14 de mySQL) :

    CREATE TABLE `emp_members` (

    `id_member` mediumint(9) NOT NULL auto_increment,
    `since` datetime NOT NULL default '0000-00-00 00:00:00',
    `ip` varchar(15) NOT NULL default '',
    `state` enum('temp','active','banned') NOT NULL default 'temp',
    `login` varchar(20) NOT NULL default '',
    `pwd` varchar(20) NOT NULL default '',
    `civility` enum('1','2','3') NOT NULL default '1',
    `firstname` varchar(30) NOT NULL default '',
    `name` varchar(30) NOT NULL default '',
    `email` varchar(30) NOT NULL default '',
    `birthdate` date NOT NULL default '0000-00-00',
    `address_1` varchar(100) NOT NULL default '',
    `address_2` varchar(50) NOT NULL default '',
    `zip` varchar(10) NOT NULL default '',
    `city` varchar(30) NOT NULL default '',
    `country` smallint(6) NOT NULL default '0',
    `last_login` datetime NOT NULL default '0000-00-00 00:00:00',
    `points` mediumint(9) NOT NULL default '0',
    `earning` mediumint(9) NOT NULL default '0',
    `sponsor` mediumint(9) NOT NULL default '0',
    PRIMARY KEY (`id_member`)

    )
    CREATE TABLE `emp_godsons` (

    `id_godson` mediumint(9) NOT NULL auto_increment,
    `since` datetime NOT NULL default '0000-00-00 00:00:00',
    `member` mediumint(9) NOT NULL default '0',
    `state` enum('temp','valid') NOT NULL default 'temp',
    `code` varchar(20) NOT NULL default '',
    `agency` enum('3','4') NOT NULL default '3',
    PRIMARY KEY (`id_godson`),
    UNIQUE KEY `uniq` (`code`,`agency`)

    )
    Je cherche à modifier le champ "emp_members.sponsor" et le champ "emp_godsons.state" lorsque ces derniers valent respectivement "0" et "temp".
    Egalement, "emp_members.id_member" doit être différent de "emp_godsons.member".

    Ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    UPDATE emp_members m,
           emp_godsons g
     
    SET    m.sponsor = g.member,
           g.state = "valid"
     
    WHERE  m.sponsor = "0"
           AND m.id_member != g.member
           AND g.state = "temp"
    Si un enregistrement de "emp_members" répond à ces critères, mais qu'il y a (par exemple) 3 enregistrements dans la table "emp_godsons", tous ceux-là auront leur champ "state" modifié en "valid" alors qu'un seul d'entre eux aurait du être modifié.

    Je vois pas comment régler ce problème, une idée ?

    Merci !

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Salut

    quelle est la clée qui permet de relier une ligne de emp_members à une ligne de emp_godsons ?
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2003
    Messages : 113
    Points : 137
    Points
    137
    Par défaut
    Il n'y a aucune clef.

    Le but est d'attribuer un parrain (champ "emp_members.sponsor") aux membres qui n'en ont pas.
    Le parrain étant le membre "emp_godsons.member" qui en a fait la demande (d'où "emp_godsons.state = "temp"").

  4. #4
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    OK ^^

    La jointure que tu cherches à faire est une jointure "Linéaire"
    c'est un des plus complexes car elle n'est pas supportée par le standard SQL et qu'il faut donc l'émuler...

    Pour résoudre ton problème, je te laisse lire l'article de SQLPro : La jointure Manquante (tadaaa !!!)

    Bonne chance...

    PS : oublie pas que pour un update avec sous-requête, tu ne peux pas faire de sous requête sur une table mise à jour
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2003
    Messages : 113
    Points : 137
    Points
    137
    Par défaut
    Merci Swoög, mais j'ai pas compris grand chose

    Apparemment ce que je cherche à faire est trop complexe ?

    Cette opération ne doit être réalisée qu'une seule fois pas jour, à la limite si une autre solution plus consommatrice existe, je suis preneur.
    C'est dommage, je pensais avoir trouvé la requête du siècle

  6. #6
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    c'est pas vraiment "TROP" complexe...mais je pense que ce sera impossible à faire avec une seule requête...

    par contre, tu peux le faire en plusieurs requête
    1°) récupérer la liste des membres (id_member) sans parrains
    2°) récupérer la liste de parrains (id_godsons, member) temporaire

    3°)faire l'association avec un langage externe (et les updates en même temps...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2003
    Messages : 113
    Points : 137
    Points
    137
    Par défaut
    Ok, je voulais éviter ça tant pis

    Merci.

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

Discussions similaires

  1. [MySQL] UPDATE multiple avec un seul bouton d'envoi
    Par topvision dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 24/10/2014, 13h49
  2. [CS4] Update multiple avec Dreamweaver
    Par ravidat dans le forum Dreamweaver
    Réponses: 1
    Dernier message: 23/11/2013, 15h44
  3. [MySQL] Updates multiples avec upload d'images
    Par okoweb dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 15/02/2011, 17h10
  4. update simple avec jointure
    Par funboard dans le forum Oracle
    Réponses: 2
    Dernier message: 20/12/2008, 14h14
  5. Récupération multiple avec jointure
    Par koyot3 dans le forum Langage SQL
    Réponses: 18
    Dernier message: 28/11/2008, 13h56

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