8791 sujets

Développement web côté serveur, CMS

Bonjour à tous, j'ai un soucis concernant une requête mysql.
je cherche à lister tous mes produits avec leurs images.
Il peut exister plusieurs images (liste0, liste1, liste2,...) pour un même produit, si pas d'image "listeX",.. c'est l'image "defaut" qui est employé.
Mon soucis c'est que la requete que j'ai contruit me renvois autant "defaut", que toutes les images "listeX" pour le même "products_id". je ne souhaite pas listé "defaut" si "listeX" existe.

SELECT p2c.products_id, pi.name FROM products_to_categories p2c,
 products p, products_images pi WHERE p.products_id = p2c.products_id
AND p.products_id = pi.product AND p.products_status = '1' AND (pi.name
LIKE '%liste_' OR pi.name LIKE 'defaut') AND p2c.categories_id = '25'


je sens que je vais être obligé de m'orienter vers un SELECT à l'intérieur de ma requete, mais je souhaiterais trouvé autre chose de moins gourmand.
Si quelqu'un à une idée ?
merci
Modifié par joss.eve (28 Aug 2007 - 17:42)
Alors je n'ai pas trouvé l'optimisation que je voulais mais
je vous donne à toute fin utile les traces de ma cogitation, pour le momment je m'en contente, le post reste ouvert

Le problème:
une table qui contient les produits, une table qui contient les images.
le but:
afficher l'image par "defaut" du produit, s'il n'existe pas d'imageS spécifiques (liste)
Le résultat actuel:
SELECT p.products_id, pi.name, @liste:=(SELECT pg.name
FROM products_images pg
WHERE pg.product = p.products_id AND pg.name
LIKE 'liste_' LIMIT 0,1) AS liste
FROM products p, products_images pi
WHERE p.products_id = pi.product AND p.products_status = 1
AND (pi.name = 'defaut' OR pi.name LIKE 'liste_') 


la table "products_images" est intérrogé pour renvoyer sur la variable @liste la valeur de l'image liste

La requête renvois les champs products_id, name, @liste;
quand name = "defaut", @liste est soit "null", soit = à la valeur du nom de l'image renvoyé par (LIKE 'liste_'), limité à 1 car @liste ne peut que contenir 1 valeur à la fois.

ce qui donne un tableau comme ceci:

--------------------------------
| products_id |  name   |  liste  |
--------------------------------
|      10     |  defaut |  NULL   |
|      11     |  defaut |  NULL   |
|      12     |  defaut |  NULL   |
|      14     |  defaut |  liste0 |
|      14     |  liste0 |  liste0 |
|      14     |  liste1 |  liste0 |


J'applique ensuite mon code PHP pour filtrer la requête:

while($products_array = mysql_fetch_array($products_query)) {
   if ($products_array['name'] == 'defaut') {
      if ($products_array['liste'] != '') {
         $nombre_produits =- 1;
     } else {
         echo(AfficheVignette($products_array["products_id"], $products_array["name"]));
     }		
   } else {
      echo(AfficheVignette($products_array["products_id"], $products_array["name"]));
   }
}


OPTIMISATION: ce qui reste à faire
-faire en sorte que mysql ne renvois pas la ligne quand les champs name = defaut, et liste != null
Il semble qu'il ne soit pas possible d'utiliser une valeur de variable dans un where.
j'ai essayé cela, sans succès:
SELECT p.products_id, pi.name, @liste:=(SELECT pg.name
FROM products_images pg
WHERE pg.product = p.products_id AND pg.name
LIKE 'liste_' LIMIT 0,1) AS liste
FROM products p, products_images pi
WHERE p.products_id = pi.product AND p.products_status = 1
AND (pi.name = 'defaut' OR pi.name LIKE 'liste_') AND @liste != null 

Modifié par joss.eve (29 Aug 2007 - 12:42)