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

Langage SQL Discussion :

[MySQL 4.1.9] Update sur une colonne prix en fonction d'un autre article


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [MySQL 4.1.9] Update sur une colonne prix en fonction d'un autre article
    Bonjour,

    Je n'arrive pas ecrire l'ordre SQL pour faire la mise à jour suivante :
    dans une table article, j'ai une colonne ref_article et une colonne prix_article

    Dans la colonne ref_article j'ai des article de type ABA30 avec le prix associé chargé depuis un csv.

    Pour certains articles avec des codes nuances, par exemple des pots de peinture de couleurs différentes, j'ai une ref_article de la famille ex: BAD01 avec des ref_article différentes pour chaque nuance ex BAD01A = blanc, BAD01F = noir, BAD01T = rouge, ... avec un prix à NULL car non disponible au chargement alors qu'il est égal au prix disponible de la famille BAD01.

    Comment ecrire l'ordre SQL de mise à jour :
    UPDATE article
    SET prix_article des BAD01x = prix_article du BAD01

    pour toutes les nuances de tous les articles de la table

    merci pour votre aide
    Paul

  2. #2
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Salut,

    essaye ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE article
       SET prix_article = (SELECT prix_article 
                             FROM article
                            WHERE reference = 'BAD01'
     WHERE SUBSTR(reference, 1, 5) = 'BAD01';
    Comme tu n'as pas précisé ton SGBD comme spécifié dans les CONSEILS... à lire AVANT de POSTER, je ne sais pas si SUBSTR est supporté par ton SGBD, mais tu trouveras sans doute ton bonheur ici : Toutes les fonctions de SQL
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci Xo pour ta réponse.

    Je suis sur Mysql 4.1.9 et quand j'essaie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     UPDATE easy_pop
    SET `v_products_price` = (SELECT `v_products_price` 
                                          FROM easy_pop
                                          WHERE `v_products_model` = 'AAA05047')
     WHERE SUBSTR(`v_products_model`, 1, 8) = 'AAA05047'
    j'ai le message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      #1093 - You can't specify target table 'easy_pop' for update in FROM clause
    D'autres part j'ai plusieurs articles avec des suffixes nuances ajoutés aux codes articles donc l'update doit être global sur tous les articles.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    -- 
    -- Structure de la table `easy_pop`
    -- 
     
    CREATE TABLE `EASY_POP` (
      `EAP_ID`           INT(10) UNSIGNED NOT NULL DEFAULT '0' ,
      `V_PRODUCTS_MODEL` VARCHAR(12) NOT NULL DEFAULT '' ,
      `V_PRODUCTS_PRICE` DECIMAL(15,4) DEFAULT '0.0000' ,
      PRIMARY KEY( `EAP_ID` ),
      UNIQUE KEY `V_PRODUCTS_MODEL`( `V_PRODUCTS_MODEL` ))
    ENGINE = MYISAM
    DEFAULT CHARSET = LATIN1;
    -- 
    -- Contenu de la table `easy_pop`
    -- 
     
    INSERT INTO `EASY_POP` VALUES     (10,'AAA05047',12.0000);
     
    INSERT INTO `EASY_POP` VALUES     (11,'AAA05047A',NULL);
     
    INSERT INTO `EASY_POP` VALUES     (12,'AAA05047B',NULL);
     
    INSERT INTO `EASY_POP` VALUES     (14,'AAA10012',16.2000);
     
    INSERT INTO `EASY_POP` VALUES (15,'AAA10012A',NULL);
    Ce qui ne donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
           Code Art      Prix
    10 - AAA05047  - 12.0000
    11 - AAA05047A - NULL
    12 - AAA05047B - NULL
    14 - AAA10012  - 16.2000
    15 - AAA10012A - NULL
    et je souhaiterai faire l'update pour avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    10 - AAA05047   - 12.0000
    11 - AAA05047A  - 12.000
    12 - AAA05047B  - 12.000
    14 - AAA10012   - 16.2000
    15 - AAA10012A  - 16.200
    Merci pour votre aide
    Paul

    MySQL 4.1.9

  4. #4
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Salut,

    Il te faut sans doute un alias dans la sous-requête, vu qu'elle lit la même table, essaye ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE article
       SET prix_article = (SELECT P.prix_article 
                             FROM article P
                            WHERE P.reference = 'BAD01'
     WHERE SUBSTR(reference, 1, 5) = 'BAD01';
    Ensuite, pour que la requête traite TOUS les cas de ta table, le plus simple serait de faire une boucle sur tous les prix principaux, mais cela sort du simple cadre du SQL. SI tu connais PHP, je te conseille de procéder ainsi.
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Ordres Update résolvant le pb :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE `easy_pop` as e1 join `easy_pop` as e2
      SET  E1.V_PRODUCTS_PRICE = E2.V_PRODUCTS_PRICE
    WHERE SUBSTR(e1.v_products_model, 1, 8)=SUBSTR(e2.v_products_model, 1, 8) 
    AND e2.V_PRODUCTS_PRICE IS NOT NULL


    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE `easy_pop` as e1 join `easy_pop` as e2
    SET  E1.V_PRODUCTS_PRICE = E2.V_PRODUCTS_PRICE
    WHERE SUBSTR(e1.v_products_model, 1, 8)=SUBSTR(e2.v_products_model, 1, 8) 
    AND e2.V_PRODUCTS_PRICE IS NOT NULL 
    AND e2.eap_id != e1.eap_id


    ou encore

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE `easy_pop` as e1 join `easy_pop` as e2
    ON SUBSTR(e1.v_products_model, 1, 8)=SUBSTR(e2.v_products_model, 1, 8) 
    AND e2.V_PRODUCTS_PRICE IS NOT NULL 
    AND e2.eap_id != e1.eap_id 
    SET  E1.V_PRODUCTS_PRICE = E2.V_PRODUCTS_PRICE
    Have Fun

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

Discussions similaires

  1. update sur une colonne
    Par flash22 dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 31/03/2011, 11h29
  2. update sur une colonne
    Par serna dans le forum Débuter
    Réponses: 2
    Dernier message: 30/12/2010, 11h05
  3. Performance d'un update sur une colonne
    Par melendil dans le forum DB2
    Réponses: 2
    Dernier message: 31/03/2009, 14h41
  4. [MySQL] [MySQL] Problème d'update sur une redirection
    Par Boons49 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 09/03/2009, 15h16
  5. Réponses: 5
    Dernier message: 15/06/2007, 16h05

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