firefoxmen Posted September 14, 2015 Share Posted September 14, 2015 Bonjour à tous et à toute, Je reviens vers vous pour vous poser une petite question qui ne doit pas être compliqué mais sur laquelle je bloque. Je voudrais faire une requête SQL pour faire comme un filtre. Par exemple je ne veux que les objets Bleu. Pour ça j'ai cru comprendre qu'il fallait utiliser LEFT JOIN mais voila quand je l'utilise j'ai tous mes produits qui sortes (même ceux qui n'ont pas la déclinaison) et je les ai en doubles. Voila ma requête : SELECT pl.name "nom", p.name "color"FROM ps_attribute_lang p, ps_product_lang plLEFT JOIN ps_product_attribute pa ON (pl.id_product = pa.id_product)WHERE p.id_lang = 1AND p.name = "Bleu" Quelqu'un pourrait me mettre sur la voix ? Cordialement, Link to comment Share on other sites More sharing options...
firefoxmen Posted September 14, 2015 Author Share Posted September 14, 2015 (edited) Bon, petite avancée j'arrive a avoir le bon produit. Le problème c'est qu'il me l'affiche en double SELECT pl.name "nom", p.name "color"FROM ps_attribute_lang p, ps_product_lang plLEFT JOIN ps_product_attribute pa ON (pl.id_product = pa.id_product)WHERE p.id_lang = 1AND p.name = "Bleu" exemple je veut les produits ayant la couleur "Bleu" mais le produit test s'affiche deux fois. Pourquoi ? Cordialement, EDIT : re-nouvelle qui a un peu tout cassé SELECT p.id_product_attribute "id_attribute" , p.id_product "id_from_attribute", pl.id_product "id_from_product", pl.name "name", pa.name "color"FROM ps_product_attribute pLEFT JOIN ps_product_lang pl ON (pl.id_product = p.id_product)LEFT JOIN ps_attribute_lang pa ON (pa.id_attribute = p.id_product_attribute)WHERE pl.id_lang = 1AND pa.name = "Bleu" le truc c'est que je n'ai qu'un produit qui est sortit (alors qu'il y en a bien plus qui possède la couleur bleu dans leurs déclinaisons) et le pire, c'est que le produit affiché ne possède même pas la couleur bleu. Du coup où est-ce que ça coince ? Edited September 14, 2015 by firefoxmen (see edit history) Link to comment Share on other sites More sharing options...
Olecorre Posted September 14, 2015 Share Posted September 14, 2015 Bonsoir, Plusieurs problèmes dans votre requête SELECT pl.name "no"m", p.name "color"FROM ps_attribute_lang p, ps_product_lang plLEFT JOIN ps_product_attribute pa ON (pl.id_product = pa.id_product)WHERE p.id_lang = 1AND p.name = "Bleu en FROM, deux tables mais aucune jointure ensuite vous voulez récupérer le nom du produit et le valeur de l'attribut mais vous appeler null le lien entre un produit et les attributs voici une requête qui fonctionne SELECT pl.name as nom, al.name as color FROM ps_product_lang pl INNER JOIN ps_product_attribute pa ON (pa.id_product = pl.id_product AND pl.id_lang=1) INNER JOIN ps_product_attribute_combination pac ON pa.id_product_attribute=pac.id_product_attribute INNER JOIN ps_attribute_lang al ON (pac.id_attribute = al.id_attribute AND al.id_lang=1) WHERE al.name = "Bleu" Cdt Link to comment Share on other sites More sharing options...
firefoxmen Posted September 15, 2015 Author Share Posted September 15, 2015 (edited) Bonjour Merci de m'avoir répondu aussi vite ! J'ai bien testé votre requête SELECT pl.name as nom, al.name as color FROM ps_product_lang pl INNER JOIN ps_product_attribute pa ON (pa.id_product = pl.id_product AND pl.id_lang=1) INNER JOIN ps_product_attribute_combination pac ON (pa.id_product_attribute = pac.id_product_attribute) INNER JOIN ps_attribute_lang al ON (pac.id_attribute = al.id_attribute AND al.id_lang=1) WHERE al.name = "Bleu" Mais j'ai le message d'erreur "When multiple tables are used, each attribute must refer back to a table." Pourtant toutes les variables sont bien précédés de leurs tables non ? Cordialement, Edited September 15, 2015 by firefoxmen (see edit history) Link to comment Share on other sites More sharing options...
Olecorre Posted September 16, 2015 Share Posted September 16, 2015 Bonjour, Etonnant jamais eu cette erreur. J ai teste la requete sur une de mes bases et elle fonctionne Cdt Link to comment Share on other sites More sharing options...
Rosiel Posted September 16, 2015 Share Posted September 16, 2015 Bonnsoir, Olecorre a l'air de connaître le sql et j'en profite (je n'ai pas trouvé ailleurs) : J'ai plus de 3500 produits et seuls les noms et descriptions en français sont remplis. (table ps_product-lang) Je souhaite remplir les champs nom ('name'), et 'description' du produit dans les autres langues seulement quand ces mêmes champs sont restées vides. En résumé : COPIE 'name' et 'description 'de id-lang 2 (français) par id produit, vers 'name' et 'description"de id-lang 1,3 et 4. (anglais, espagnol et italien). Sauriez-vous m'orienter. J'ai essayé pleins de formules avec conditions, mais visiblement il y a toujours un truc qui ne gaze pas. Je vous remercie d'avance si vous pouvez m'aider. S Link to comment Share on other sites More sharing options...
Alexandre Carette Posted September 16, 2015 Share Posted September 16, 2015 Bonjour, Pourquoi ne pas utiliser le système d'import de prestashop, avec des fichiers csv qui vont bien ? CDT Link to comment Share on other sites More sharing options...
Olecorre Posted September 16, 2015 Share Posted September 16, 2015 C'est faisable en sql, J'ai pas la requete exacte (il est tard et apres ma journee de 14h suis ko) mais ca ressemble a ca : Insert into ps_product_lang (id_shop, id_product, nale, description) select 1, id_product, name, description from ps_product_lang where id_lang=2 Cdt Link to comment Share on other sites More sharing options...
Olecorre Posted September 17, 2015 Share Posted September 17, 2015 Bonjour, J'etais fatigue hier car la requete est valable pour ajouter des lignes pour mettre a jour il faut mieux passe par un petit script php. Cdt Link to comment Share on other sites More sharing options...
Rosiel Posted September 19, 2015 Share Posted September 19, 2015 Bonjour et merci d'avoir répondu Pour l'import csv, je vais essayer aujourd'hui. Sinon pour la requête sql, on ne peut pas faire la même chose mais au lieu d'un insert, un update ou une commade de mise-à-jour ? Bon weekend et merci encore. Cordialement Link to comment Share on other sites More sharing options...
Neza Posted September 19, 2015 Share Posted September 19, 2015 Bonjour, @sofano Voici une requête de mise à jour qui permet d'alimenter les colonnes name et description de la langue 2 à partir de la langue 1 update `ps_product_lang` a left join `ps_product_lang` b on a.`id_product` = b.`id_product` and a.`id_shop` = b.`id_shop` set a.`description` = b.`description`, a.`name` = b.`name` where a.`id_lang` = 1 and a.`name` = ' ' and b.`id_lang` = 2 A modifier pour les autres langues sur le where et éventuellement suivant les colonnes à alimenter. A utiliser avec les précautions d'usage, tests et sauvegardes ... Link to comment Share on other sites More sharing options...
Rosiel Posted September 19, 2015 Share Posted September 19, 2015 Merci ! je préfère la solution sql. L'import est plus galère ... en test ça a marché mais pas sur mon site en production à cause de permissions sur des dossiers dans cache/smarty que je n'ai pas pu changé via ftp, car le changement des permissions est interdite sur certains dossiers, et rien à faire côté serveur. Oui je le fais d'abord sur un site test. Bonne soirée Link to comment Share on other sites More sharing options...
Rosiel Posted October 2, 2015 Share Posted October 2, 2015 Bonjour, J'ai bien mis à jour mes tables et je te remercie Neza pour la requête. je voulais juste dire que pour l'énoncé c'est l'inverse : "Voici une requête de mise à jour qui permet d'alimenter les colonnes name et description de la langue 1 à partir de la langue 2" cela m'a beaucoup servi et me servira pleinement. Bonne journée à vous. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now