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

  1. #1
    Candidat au Club
    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

    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
    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

    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
    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é
    bonjour,


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

    L'approche de aieuu me semble satisfaisante.

  7. #7
    Modérateur

    ... et pour pouvoir optimiser, il faudrait la description complète de vos table + index

  8. #8
    Candidat au Club
    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

###raw>template_hook.ano_emploi###