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
    Membre à l'essai
    Profil pro
    Inscrit en
    juin 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2007
    Messages : 40
    Points : 20
    Points
    20

    Par défaut Requête SQL compliquée (pour moi)

    Bonjour à tous,

    Cela fait quelques heures que je bute sur une requête pas très compliquée en sois, mais qui visiblement dépasse mes compétences ou ma logique

    Je cherche à modifier des prix sur une table en fonction d'une valeur présente dans une autre table.


    Voici la partie qui met à jour en fonction de la valeur en question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET ps_specific_price.price = ps_product.wholesale_price * (SELECT substring_index(substring_index(name, '(', -1),')', 1) FROM ps_attribute_lang WHERE ....
    // La valeur qui permet le calcul du prix se situe dans le champ ps_atribute_lang.name entre des parenthèses


    voici le schema des tables (uniquement ce qui nous intéresse):

    ps_specific_price : id_product, id_product_attribute, price
    ps_product : id_product, ps_product.wholesale_price
    ps_product_attribute_combination : id_attribute, id_product_attribute
    ps_attribute_lang : id_attribute, name

    L'idée est donc de mettre à jour ps_specific_price.price en le multipliant par la valeur récupérée dans ps_attribute_lang.name


    Voici mon brouillon de 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
    15
    16
    17
    UPDATE `ps_specific_price` 
    INNER JOIN ps_product ON ps_specific_price.id_product = ps_product.id_product
     
    SET ps_specific_price.price = ps_product.wholesale_price * (SELECT substring_index(substring_index(name, '(', -1),')', 1) FROM ps_attribute_lang 
     
    INNER JOIN ps_specific_price ON                                                            
    INNER JOIN ps_product ON ps_specific_price.id_product = ps_product.id_product
    INNER JOIN ps_product_attribute_combination ON ps_specific_price.id_product_attribute = ps_product_attribute_combination.id_product_attribute
     
    WHERE 
    ps_specific_price.id_product = ps_product.id_product 
    AND ps_specific_price.id_product_attribute = ps_product_attribute_combination.id_product_attribute 
    AND ps_attribute_lang.id_attribute = ps_product_attribute_combination.id_attribute  )
     
     
    WHERE ps_specific_price.id_product = ps_product.id_product 
    AND ps_specific_price.price <> -1

    D'avance je vous remercie de votre aide.
    Bonne journée
    Romain

  2. #2
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    4 118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 4 118
    Points : 9 691
    Points
    9 691
    Billets dans le blog
    1

    Par défaut

    Bonjour,

    Deux problèmes dans votre requête
    - substring_index est une fonction chaine de caractères, il faut donc convertir le résultat dans un type numérique avant de multiplier
    - qu'est-ce qui garantit qu'à la position recherchée, le caractère rencontré est un chiffre ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    juin 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2007
    Messages : 40
    Points : 20
    Points
    20

    Par défaut

    Bonjour,


    Je vous remercie de votre réponse, ok il faut donc ajouter la fonction CONVERT().

    La valeur récupérer est forcément un entier de 1 à 3 chiffres.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    juin 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2007
    Messages : 40
    Points : 20
    Points
    20

    Par défaut

    Donc cela donnerait potentiellement cela :

    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
    UPDATE `ps_specific_price` 
    INNER JOIN ps_product ON ps_specific_price.id_product = ps_product.id_product
     
    SET ps_specific_price.price = ps_product.wholesale_price * 
     
    CAST((SELECT substring_index(substring_index(name, '(', -1),')', 1) FROM ps_attribute_lang 
     
    	INNER JOIN ps_product_attribute_combination ON ps_specific_price.id_product_attribute = ps_product_attribute_combination.id_product_attribute
     
    WHERE 
    ps_specific_price.id_product_attribute = ps_product_attribute_combination.id_product_attribute 
    AND ps_attribute_lang.id_attribute = ps_product_attribute_combination.id_attribute 
    )AS UNSIGNED INTEGER) 
     
    WHERE ps_specific_price.id_product = ps_product.id_product 
    AND ps_specific_price.price <> -1
    J'obtiens ceci :
    #1054 - Unknown column 'ps_specific_price.id_product_attribute' in 'on clause'
    Je ne vois pas comment joindre ps_specific_price dans le SELECT.

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    février 2011
    Messages
    3 788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : février 2011
    Messages : 3 788
    Points : 11 576
    Points
    11 576

    Par défaut

    Salut parilla77.

    Citation Envoyé par parilla77
    Voici mon brouillon de requête
    Vous ne respectez pas la syntaxe de Mysql, votre requête est incomplète.
    D'après ce que je vois, vous n'utilisez pas les clefs étrangères dans vos tables.
    En lisant le descriptif de vos tables, on ne sait pas quelles sont les colonnes qui sont en clef primaire.
    Dans votre requête, vous n'utilisez pas les sous-requêtes. Pourquoi ?
    Et comme il n'y a pas de jeu d'essais, on doit deviner.

    Pour l'extraction de la valeur numérique de la colonne "name", vu que l'on a aucun exemple, il est difficile de savoir si ce que vous donnez est correcte.
    Je vais partir de l'hypothèse que la clef primaire de la table est "id_product".

    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
    update     `ps_specific_price`  as ta
     
    inner join  (      select  t1.id_product,
                               t2.wholesale_price,
                               substring_index(substring_index(t4.name, '(', -1),')', 1) as val
     
                         from  `ps_specific_price`                as t1
     
                   inner join  `ps_product`                       as t2
                           on  t2.id_product  = t1.id_product
     
                   inner join  `ps_product_attribute_combinaison` as t3
                           on  t3.id_product_attribute = t1.id_product_attribute
     
                   inner join  `ps_attribute_lang`                as t4
                           on  t4.id_attribute         = t3.id_attribute
                ) as tb
            on  tb.id_product = ta.id_product
     
           set  ta.price = tb.wholesale_price * cast(tb.val as integer);
    Sans plus d'explication de votre part, c'est tout ce que je peux produire comme requête.

    Cette requête n'a pas été testé.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    juin 2007
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2007
    Messages : 40
    Points : 20
    Points
    20

    Par défaut

    Bonjour,

    je vous remercie,

    Voici un peu plus d'informations sur les tables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE `ps_specific_price`
     ADD PRIMARY KEY (`id_specific_price`), ADD UNIQUE KEY `id_product_2` (`id_product`,`id_product_attribute`,`id_customer`,`id_cart`,`from`,`to`,`id_shop`,`id_shop_group`,`id_currency`,`id_country`,`id_group`,`from_quantity`,`id_specific_price_rule`), ADD KEY `id_product` (`id_product`,`id_shop`,`id_currency`,`id_country`,`id_group`,`id_customer`,`from_quantity`,`from`,`to`), ADD KEY `from_quantity` (`from_quantity`), ADD KEY `id_specific_price_rule` (`id_specific_price_rule`), ADD KEY `id_cart` (`id_cart`), ADD KEY `id_product_attribute` (`id_product_attribute`), ADD KEY `id_shop` (`id_shop`), ADD KEY `id_customer` (`id_customer`), ADD KEY `from` (`from`), ADD KEY `to` (`to`);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE `ps_product`
     ADD PRIMARY KEY (`id_product`), ADD KEY `product_supplier` (`id_supplier`), ADD KEY `product_manufacturer` (`id_manufacturer`,`id_product`), ADD KEY `id_category_default` (`id_category_default`), ADD KEY `indexed` (`indexed`), ADD KEY `date_add` (`date_add`), ADD KEY `state` (`state`,`date_upd`);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE `ps_product_attribute_combination`
     ADD PRIMARY KEY (`id_attribute`,`id_product_attribute`), ADD KEY `id_product_attribute` (`id_product_attribute`);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE `ps_attribute_lang`
     ADD PRIMARY KEY (`id_attribute`,`id_lang`), ADD KEY `IDX_3ABE46A77A4F53DC` (`id_attribute`), ADD KEY `IDX_3ABE46A7BA299860` (`id_lang`);

Discussions similaires

  1. Requête trop compliquée pour moi
    Par florenzino dans le forum Requêtes
    Réponses: 3
    Dernier message: 31/05/2017, 16h31
  2. Requête SQL trop compliquée pour moi
    Par goldenboy68 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 10/04/2008, 15h50
  3. Une requête bien compliquée pour moi
    Par bellande dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 01/02/2007, 22h51
  4. [SQL - ORACLE] Requete un peu compliquée (pour moi)
    Par Worldofdada dans le forum Langage SQL
    Réponses: 15
    Dernier message: 03/11/2005, 09h25
  5. Requête un peu trop compliqué pour moi
    Par Kokito dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/04/2005, 16h17

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