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 sur table en fonction d'une valeur sur une autre table


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2012
    Messages : 9
    Points : 4
    Points
    4
    Par défaut UPDATE sur table en fonction d'une valeur sur une autre table
    Bonjour,

    Voila je me met a toucher un peut a ma base MySQL, j'ai écrit cette requête qui fonctionne bien:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    update MaTable1
       set enable = '0',
           lien = '404'
     where nombre in(
               select nombre
                 from MaTable3
                where nombre = 0
           )
    ;
    Je souhaiterais maintenant exécuter la même requête mais faire un update sur MaTable2 et sa ne fonctionne pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    update MaTable2
       set enable = '0',
           lien = '404'
     where nombre in(
               select nombre
                 from MaTable3
                where nombre = 0
           )
    ;
    mysql m'indique:
    #1054 - Unknown column 'nombre' in 'IN/ALL/ANY subquery'
    j'ai essayer plusieurs requête mais je ne doit pas l'écrire correctement, d'après se que j'ai pue lire il faudrait faire une jointure, mais je ni suis pas arriver.

    Merci pour votre aide

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Qu'essayez vous de faire ?????
    Je ne comprend pas bien l’intérêt de votre sous requête

    Et visiblement MaTable3 ne contient pas de colonne "nombre"

    postez les DDL de vos tables et précisez ce que vous voulez faire

  3. #3
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2012
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    j'essai de changer les valeurs de 'enable' et 'lien' contenu dans MaTable1 en fonction de ce qu'il se trouve dans MaTable3 a la colonne 'nombre' dans mon cas un 0.

    MaTable2 contient les colonnes: id_produit,enable,lien <== cette table stock l'état du produit

    MaTable3 contient les colonnes: id,id_produit,nombre <== cette table stock la quantité de produit

    Le lien pour retrouver la bonne ligne entre ces deux table est fait par id_produit

    Le but rechercher: obtenir les 'id_produit' ayant un nombre = à 0 afin de changer 'enable' et 'lien' sur MaTable1 en se basant sur 'id_produit' qui es present sur ces 2 table.

    id_produit est en clé primaire sur MaTable1 ( c'est peut-être pour cela que ma 1ere requête fonctionne ) et es en clé étrangère sur MaTable2 et MaTable3.

    pourtant si il y a bien 'nombre' dans MaTable3, c'est pour sa que je ne voit pas se que je peut lui dire de plus...

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    hmmm, pas sûr d'avoir tout compris, mais il me semble que c'est sur l'id_produit que vous devez filtrer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ...
    WHERE id_produit IN (SELECT id_produit FROM Table3 where Nombre = 0)

  5. #5
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2012
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Grace a votre réponse j'ai réussi en créant un deuxième select a l'intérieur du premier, je ne sais pas si c'est vraiment de cette manière que cela doit s'écrire, mais sa fonctionne correctement, la requête dure 330 seconde il y a 30000 ligne a balayer et "seulement" 1516 ligne a modifier.
    Cela devra se répéter tout les jours.

    Je voulais donc avoir vos avis pour optimiser la requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    update MaTable2
       set enable = '0',
           lien = '404'
           WHERE id_product IN 
           		(SELECT id_product 
           		FROM MaTable3
           			WHERE nombre IN 
    			(SELECT nombre 
    			FROM MaTable3 
    				WHERE nombre = 0
                                    )	
    	)
    ;
    Je vous remercie d'avance

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,


    je ne comprend pas bien l'utilité de la 2eme sous requete.

    L'approche de aieuu me semble satisfaisante.

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    ... et pour pouvoir optimiser, il faudrait la description complète de vos table + index

  8. #8
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2012
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Voici ce que me donne la commande show, j'espère qu'il y aura les information d'on vous avez besoin:

    SHOW columns FROM MaTable1

    Field Type Null Key Default Extra
    id_produit int(10) unsigned NO PRI NULL auto_increment
    enable tinyint(1) unsigned NO 0
    lien enum('','404') NO
    SHOW index FROM MaTable1

    Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
    MaTable1 0 PRIMARY 1 id_produit A 30199 NULL NULL BTREE
    SHOW columns FROM MaTable2

    Field Type Null Key Default Extra
    id_produit int(10) unsigned NO PRI NULL
    enable tinyint(1) unsigned NO 0
    lien enum('','404') NO
    SHOW index FROM MaTable2

    Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
    MaTable2 0 PRIMARY 1 id_produit A 30111 NULL NULL BTREE
    SHOW columns FROM MaTable3

    Field Type Null Key Default Extra
    id_stock_available int(11) unsigned NO PRI NULL auto_increment
    id_product int(11) unsigned NO MUL NULL
    nombre int(10) NO 0
    SHOW index FROM MaTable3

    Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
    MaTable3 0 PRIMARY 1 id_stock_available A 28537 NULL NULL BTREE
    MaTable3 0 produit_sqlstock 1 id_produit A 28537 NULL NULL BTREE
    MaTable3 1 id_produit 1 id_produit A 28537 NULL NULL BTREE

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/04/2015, 11h17
  2. [AC-2003] Mettre à jour un champ d'une table en fonction de la valeur d'une combobox
    Par Chagui dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 19/11/2010, 18h26
  3. Réponses: 1
    Dernier message: 28/11/2007, 00h18
  4. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48
  5. Réponses: 2
    Dernier message: 19/05/2006, 18h42

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