sélection plusieurs valeurs pour le même id

overdoze
Invité n'ayant pas de compte PHPfrance

12 janv. 2012, 15:32

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

Eléphant du PHP | 209 Messages

12 janv. 2012, 15:43

Salut,

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

ViPHP
ViPHP | 2577 Messages

13 janv. 2012, 10:34

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

ViPHP
xTG
ViPHP | 7331 Messages

13 janv. 2012, 11:14

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 ?

neo25
Invité n'ayant pas de compte PHPfrance

16 janv. 2012, 14:46

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

neo25
Invité n'ayant pas de compte PHPfrance

16 janv. 2012, 14:51

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

ViPHP
xTG
ViPHP | 7331 Messages

16 janv. 2012, 14:55

On peut avoir le mcd ou mld de ce machin ?

Petit nouveau ! | 3 Messages

16 janv. 2012, 15:15

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.

ViPHP
xTG
ViPHP | 7331 Messages

16 janv. 2012, 16:06

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.

Eléphant du PHP | 67 Messages

16 janv. 2012, 16:59

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 :)

ViPHP
xTG
ViPHP | 7331 Messages

16 janv. 2012, 17:03

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

Petit nouveau ! | 3 Messages

16 janv. 2012, 17:46

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

ViPHP
xTG
ViPHP | 7331 Messages

16 janv. 2012, 18:26

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.

ViPHP
ViPHP | 2287 Messages

17 janv. 2012, 03:40

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 ?
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphant du PHP | 67 Messages

17 janv. 2012, 09:42

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