Page 1 sur 1

sélection plusieurs valeurs pour le même id

Posté : 12 janv. 2012, 15:32
par overdoze
bonjour a tous
j'ai des produits enregistrés dans ma base de donnée, chaque produit a des attributs liés (environ 3 pour chaque produit). je veux récupérer en une seul ligne chaque id_pdt avec ces attribut liés
id_pdt+nom_pdt+att1+att2+att3+prixatt1+prixatt2+prixatt3 pour les exporter ensuite dans un fichier csv.
j'ai exécuter une requête sql complexe pour sélectionner les attributs liés a chaque produit mais j'ai trois ligne pour chaque id_pdt comme ça :
id_pdt+nom_pdt+att1+vide+vide+prixatt1+vide+vide
id_pdt+nom_pdt+vide+att2+vide+vide+prixat2+vide
id_pdt+nom_pdt+vide+vide+att3+vide+vide+prixatt3

comment je peut combiner les trois ligne en une seule ligne?
quelqu'un a une idée??
merci d'avance

Re: sélection plusieurs valeurs pour le même id

Posté : 12 janv. 2012, 15:43
par Shenryu
Salut,

Est-ce que tu peux nous montrer ta requête SQL ?

Re: sélection plusieurs valeurs pour le même id

Posté : 13 janv. 2012, 10:34
par Mazarini
Une requete genre :

select T1.id_pdt, T1.nom_pdt, T1.att1, T2.att2, T3.att3, T1.prix, T2.prix, T3.prix
from taTable as T1, taTable as T2, taTable as T3
where T1.id = T2.id and T2.id = T3.id And T1.att1 not null And T2.att2 not null And T3.att3 not null

Re: sélection plusieurs valeurs pour le même id

Posté : 13 janv. 2012, 11:14
par xTG
Essaies avec cette syntaxe :
SELECT T1.id_pdt, T1.nom_pdt, T1.att1, T2.att2, T3.att3, T1.prix, T2.prix, T3.prix
FROM taTable as T1 INNER JOIN taTable as T2 ON (T1.id = T2.id)
 INNER JOIN taTable as T3 ON (T2.id = T3.id)
where T1.att1 not null And T2.att2 not null And T3.att3 not null
Mais le schéma me semble bizarre... Une table différente par attribut ?

Re: sélection plusieurs valeurs pour le même id

Posté : 16 janv. 2012, 14:46
par neo25
voici ma requête :

Code : Tout sélectionner

SELECT pa.id_product, (SELECT pa.price FROM product_attribute pa WHERE pa.id_product_attribute =pac.id_product_attribute AND pac.id_attribute =31) as prixA, (SELECT pa.price FROM product_attribute pa WHERE pa.id_product_attribute =pac.id_product_attribute AND pac.id_attribute =32) as prixB, (SELECT pa.price FROM product_attribute pa WHERE pa.id_product_attribute =pac.id_product_attribute AND pac.id_attribute =33) as prixC, (SELECT pa.quantity FROM product_attribute pa WHERE pa.id_product_attribute =pac.id_product_attribute AND pac.id_attribute =31) as QteA, (SELECT pa.quantity FROM product_attribute pa WHERE pa.id_product_attribute =pac.id_product_attribute AND pac.id_attribute =32) as QteB, (SELECT pa.quantity FROM product_attribute pa WHERE pa.id_product_attribute =pac.id_product_attribute AND pac.id_attribute =33) as QteC FROM product_attribute pa LEFT JOIN product_lang pl ON (pa.id_product = pl.id_product) LEFT JOIN product_attribute_combination pac ON (pa.id_product_attribute = pac.id_product_attribute) LEFT JOIN attribute_lang al ON (pac.id_attribute = al.id_attribute) WHERE al.id_lang =2 AND pl.id_lang = 2 AND pa.`id_product` IN ('.$tab['id_product'].') GROUP BY pac.id_product_attribute ORDER BY pl.name ASC

Re: sélection plusieurs valeurs pour le même id

Posté : 16 janv. 2012, 14:51
par neo25
voici ma requête :

Code : Tout sélectionner

SELECT pa.id_product, (SELECT pa.price FROM product_attribute pa WHERE pa.id_product_attribute =pac.id_product_attribute AND pac.id_attribute =31) as prix1, (SELECT pa.price FROM product_attribute pa WHERE pa.id_product_attribute =pac.id_product_attribute AND pac.id_attribute =32) as prix2, (SELECT pa.price FROM product_attribute pa WHERE pa.id_product_attribute =pac.id_product_attribute AND pac.id_attribute =33) as prix3, (SELECT pa.quantity FROM product_attribute pa WHERE pa.id_product_attribute =pac.id_product_attribute AND pac.id_attribute =31) as Qte1, (SELECT pa.quantity FROM product_attribute pa WHERE pa.id_product_attribute =pac.id_product_attribute AND pac.id_attribute =32) as Qte2, (SELECT pa.quantity FROM product_attribute pa WHERE pa.id_product_attribute =pac.id_product_attribute AND pac.id_attribute =33) as Qte3 FROM product_attribute pa LEFT JOIN product_lang pl ON (pa.id_product = pl.id_product) LEFT JOIN product_attribute_combination pac ON (pa.id_product_attribute = pac.id_product_attribute) LEFT JOIN attribute_lang al ON (pac.id_attribute = al.id_attribute) WHERE al.id_lang =2 AND pl.id_lang = 2 GROUP BY pac.id_product_attribute ORDER BY pl.name ASC

Re: sélection plusieurs valeurs pour le même id

Posté : 16 janv. 2012, 14:55
par xTG
On peut avoir le mcd ou mld de ce machin ?

Re: sélection plusieurs valeurs pour le même id

Posté : 16 janv. 2012, 15:15
par overdoze
je schématise les tables :
table product
id_product,quantity,price,
table product_lang
id_product,name,short_description,
table product_attribute_combination
id_attribute,id_product_attribute
(cette table contient les 3 id des attributs 31,32 et 33)
table product_attribute
id_product_attribute,id_product,price,quantity,
dans cette table (product_attribute ), il y a 3 lignes pour chaque produit.
ce que je veut faire c'est de sélectionner tous les Ids produits puis parcourir la table product_attribute pour récupérer les valeurs des 3 attributs (3 quantités et 3 prix) dans une seule ligne.
j'espère que c'est assez clair pour vous.

Re: sélection plusieurs valeurs pour le même id

Posté : 16 janv. 2012, 16:06
par xTG
J'ai repris la table product et product_attribute pour la requête suivante :
SELECT 
  (SELECT price FROM product_attribute AS pa WHERE pa.id_product = p.id AND pa.id_product_attribute = 31) AS price31,
  (SELECT price FROM product_attribute AS pa WHERE pa.id_product = p.id AND pa.id_product_attribute = 32) AS price32,
  (SELECT price FROM product_attribute AS pa WHERE pa.id_product = p.id AND pa.id_product_attribute = 33) AS price33,
  (SELECT quantity FROM product_attribute AS pa WHERE pa.id_product = p.id AND pa.id_product_attribute = 31) AS quantity31,
  (SELECT quantity FROM product_attribute AS pa WHERE pa.id_product = p.id AND pa.id_product_attribute = 32) AS quantity32,
  (SELECT quantity FROM product_attribute AS pa WHERE pa.id_product = p.id AND pa.id_product_attribute = 33) AS quantity33
FROM product AS p
ORDER BY p.id ASC
J'obtiens bien les résultats correctement pour chacun de mes produits test.

Vérifies tes valeurs si ma requête ne te rapportent rien de mieux.

Re: sélection plusieurs valeurs pour le même id

Posté : 16 janv. 2012, 16:59
par haugure
Salut,

Si je puis me permettre, autant le faire en évitant les 6 Seq Scan car niveau performance c'est vraiment pas top.
SELECT 
	P.id,
	( case when pa.id_product_attribute = 31 THEN price ELSE 0 ) as price31,
	( case when pa.id_product_attribute = 32 THEN price ELSE 0 ) as price32,
	( case when pa.id_product_attribute = 33 THEN price ELSE 0 ) as price33
[...] IDEM POUR LES 3 AUTRES CALCUS...
 FROM product P
INNER JOIN product_attribute PA on PA.id_product = p.id
WHERE pa.id_product_attribute in ( 31, 32, 33)
order by P.id ASC
Faudrait peut etre remplacer INNER JOIN par LEFT OUTER JOIN en fonction du cas...
Par contre j'ai pas testé sous MySQL faut dire que j'utilise que postgres et db2 :)

Re: sélection plusieurs valeurs pour le même id

Posté : 16 janv. 2012, 17:03
par xTG
Avec ta requête cela va lui retourner la même chose que ce qu'il ne veut pas (cf premier post) vu que c'est ta clause WHERE de requête principale qui génère les n-uplets à traiter.
Cela dit la clause CASE ... WHEN existe pour MySQL et j'aurai appris un truc sympatoche et utile. :P

Re: sélection plusieurs valeurs pour le même id

Posté : 16 janv. 2012, 17:46
par overdoze
merci pour l'aide
j'ai essayé avec les 2 requêtes mais ça marche pas, il y a des erreurs sql en utilisant CASE

Re: sélection plusieurs valeurs pour le même id

Posté : 16 janv. 2012, 18:26
par xTG
Avec ta requête cela va lui retourner la même chose que ce qu'il ne veut pas (cf premier post) vu que c'est ta clause WHERE de requête principale qui génère les n-uplets à traiter.
Cela dit la clause CASE ... WHEN existe pour MySQL et j'aurai appris un truc sympatoche et utile. :P
Si la mienne ne te donne pas résultat c'est donc que ton jeu de données est incompatible avec ce que tu souhaites.
Isoles un jeu de données qui ne fonctionne pas (un id_product) et regardes les données correspondantes.

Re: sélection plusieurs valeurs pour le même id

Posté : 17 janv. 2012, 03:40
par Calimero
merci pour l'aide
j'ai essayé avec les 2 requêtes mais ça marche pas, il y a des erreurs sql en utilisant CASE
Quelle est la version du serveur MySQL ? La mise à jour est-elle possible ?

Re: sélection plusieurs valeurs pour le même id

Posté : 17 janv. 2012, 09:42
par haugure
Salut,

Peut être qu'il faudrait rajouter un group by dans ce cas... et diantre j'ai oublié les END pour les case raison de l'erreur SQL :p
SELECT
        P.id,
        ( case when pa.id_product_attribute = 31 THEN price ELSE 0 END ) AS price31,
        ( case when pa.id_product_attribute = 32 THEN price ELSE 0 END ) AS price32,
        ( case when pa.id_product_attribute = 33 THEN price ELSE 0 END ) AS price33
[...]
 FROM product P
INNER JOIN product_attribute PA ON PA.id_product = p.id
WHERE pa.id_product_attribute IN ( 31, 32, 33)
GROUP BY xxxx --en fonction  de ce qui sort
ORDER BY P.id ASC