Jump to content

Help requête SQL tri produit basic


Recommended Posts

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 pl
LEFT JOIN ps_product_attribute pa ON (pl.id_product = pa.id_product)
WHERE p.id_lang = 1
AND p.name = "Bleu"

 

Quelqu'un pourrait me mettre sur la voix ?

 

Cordialement,

 

 

 

 

Link to comment
Share on other sites

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 pl
LEFT JOIN ps_product_attribute pa ON (pl.id_product = pa.id_product)
WHERE p.id_lang = 1
AND 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 p
LEFT 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 = 1
AND 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 by firefoxmen (see edit history)
Link to comment
Share on other sites

Bonsoir,

 

Plusieurs problèmes dans votre requête

 

 

SELECT pl.name "no"m", p.name "color"
FROM ps_attribute_lang p, ps_product_lang pl
LEFT JOIN ps_product_attribute pa ON (pl.id_product = pa.id_product)
WHERE p.id_lang = 1
AND 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

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 by firefoxmen (see edit history)
Link to comment
Share on other sites

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

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

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

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

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

  • 2 weeks later...

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...