Afficher les produits des sous catégories

WRInaute discret
Bonjour,

j'ai des catégories qui ne contiennent que des sous-categories (pas de produits).
Lorquon est dans une catégorie mère, je souhaiterais afficher 10 produits aléatoirs issus des sous catégories.

C'est un casse tête pour moi, pouvez vous me guider ?

J'ai une table produits (avec id_produit) une table produit (avec id_cat, id_parent) et une table categorie_produits (avec id_produit, id_cat)

merce d'avance.
 
WRInaute discret
salut ..

Ca sent la requete récursive .. et la t'es pas couché surtout si il faut que je t'en explique le principe

en gros l'idée de la requete c'est ca :

SELECT p.*
FROM produits P
LEFT JOIN categories_produits CP ON P.id_produit = CP.id_produit
LEFT JOIN categories C ON C.id_categorie = CP.id_categorie
WHERE C.id_parent = 5
ORDER BY RAND()
LIMIT 10

La tu aura 10 produits aléatoires parmi les catégories directement en dessôus de ta catégorie mère..

Si tu veux aler en profondeur dans les sous-catégories, ca va etre plus chaud et j'ai meme pas le courage de t'expliquer... tapes récursivité dans google :p
 
WRInaute impliqué
J'ai une solution propre, mais qui necessite que tu modifie un peut la structure de ta base : il faut utiliser la "Représentation intervallaire des arborescense "comme expliqué ici au chapitre 2 : http://sql.developpez.com/arborescence/ cela permet de garder des bonnes perfs au niveau du traitement de la base de données
 
WRInaute accro
Bonjour


Sauf à avoir un nombre énorme de catégories et sous-catégories, en matière de performance il "suffit" de mettre en place un cache.

J'utilise ce système dans une vieille galerie photo avec catégories imbriquées (arborescence) que je suis d'ailleurs sur le point de refaire de A à Z (c'était l'un de mes premiers sites PHP :D ) et ça marche très bien, sans gros impact au niveau du serveur MySQL.

Si tes catégories ne changent pas toutes les 10mn il suffit de régler le cache sur par ex. 7 jours, et les produits affichés au hasard toutes les minutes (tout dépend de ton trafic, évidemment), et de vider partiellement le cache à chaque ajout/suppression de produit ou catégorie, qui sera reconstruit automatiquement dès la première consultation.

Ainsi les accès BDD seront fortement minimisés et les perfs s'en suivront. Mais bon je parle certainement en l'air car je ne conçois pas un site web faisant des appels BDD sans cache :roll:
 
WRInaute impliqué
Et le cache justifie de coder une base comme un porc???

Et si après il veut gérer le fait qu'il ne faille que présenter que les produits dispo, entre 2 demandes clients cela peut changer (le client juste avant a déjà pris le dernier article)

Et tu ne semble penser qu'a un usage web de la bdd, mais si plus tard, il decide de faire une appli client lourd pour attaquer sa base, les optimisation de base et de requetes sont très importantes, il faudra alors qu'il revoie toute sa base, si il la conçoit proprement dès le départ, c'est toujours ça de gagné pour plus tard.

Il ne faut jamais negliger les optimisations de bases de données, j'ai eu l'expérience dernièrement d'un client avec une base non optimisée, et dont les traitements étaient d'une lenteur, l'usage d'un cache n'aurait pas plus aider (2mn de traitement de la requete) après optimisation, c'était quasi instantanné
 
WRInaute accro
Je n'ai jamais écrit ou dit cela. Je gère des bases de données toute la journée (je suis spécialisé en analyse décisionnelle en technos Microsoft...) donc je sais ce qu'est une base optimisée, étant accessoirement architecte du système d'information de mon entreprise (centre de gestion agréé, 180 salariés, 3000 clients...)

Je m'inscrivais dans une optique "web", voilà tout :wink:

Maintenant, de là à dire qu'il faut coder comme un porc, je ne crois pas. C'est juste une solution pour optimiser les performances côté client et limiter les accès inutiles au serveur :roll:
 
WRInaute impliqué
Même dans une optique web, la gestion du cache n'est pas toujours pertinente, si dans sa requête il doit tenir compte de la gestion des stocks, il ne peut plus utiliser la technique de cache, c'est dans ce genre d'optique qu'il faut penser. C'est vrai que la sur le coup, cela va optimiser, mais plus tard?
 
WRInaute accro
Ah ben tout dépend ce qu'il doit afficher, et où.

Après c'est de la mamaille de gestionnaire (obsolescence des produits, réappros, etc.) ; d'ailleurs le cache peut ne concerner que certaines parties de pages, et en jouant sur les CSS on peut utiliser un même cache pour plusieurs types d'affichages :wink:
 
WRInaute discret
cache ou non-cache, perf ou non-perf la quiestion etait de toute facon ailleurs :p : soitt il fait du recursif pour tenir compte de la profondeur des categories et rappatrier 10 articles parmi toutes les categories enfants..

soit il modifie sa BDD pour connaitre a tout moment TOUTES les categories ancetres de chaques catégorie (ce qui ne serait pas bete.. niveau perf: p)
 
WRInaute discret
Fonction recursive, si pas des milliers de catégories, en quelques lignes c'est ok

Code:
function rand_cat($id)
     {                      
        $sql="SELECT id FROM categorie WHERE parent_cat='$id' order by rand()";
        $rt=mysql_query($sql);                      
        while ($data= mysql_fetch_array($rt))
          {  
            $sql1="SELECT * FROM produit where cat='$data[id]' order by rand() limit 0,1";  // 1 produit par sous cat
            $rt1=mysql_query($sql1);                          
            $dataprod= mysql_fetch_array($rt1);
            rand_cat($data['id']); // recursivite  
        }                        
     }
//depart mentionne parent_cat
rand_cat($depart);
 
Discussions similaires
Haut