bovitch Posté 7 Février 2008 Posté 7 Février 2008 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.
Dadou Posté 7 Février 2008 Posté 7 Février 2008 Relativement simple, j'ai supposé que ta table produit est en fait categorie non?? Et dans la requete la valeur 2 correspond à la valeur de la categorie parente SELECT `produits`.`id_produit` FROM `produits` , `categorie_produits` , `categories`WHERE `categorie_produits`.`id_produit` = `produits`.`id_produit` AND `categorie_produits`.`id_cat` = `categories`.`id_cat` AND `categories`.`id_parent` = '2'LIMIT 0 , 9
bovitch Posté 7 Février 2008 Auteur Posté 7 Février 2008 (modifié) j'ai supposé que ta table produit est en fait categorie non?? oui en effet Dans ce cas tu affiche seulement les produits presents dans les catégories filles (profondeur 1 par rapport a la catégorie mère)... En effet c assez simple. Moi j'aimerais afficher 10 produits au hasard parmi tout les sous catégories, peut importe la profondeur de la hierarchie (categorie filles, petites filles, ....) Je pense pas quon puisse faire ça seulement en requete SQL. Malgré tout merci Dadou Modifié 7 Février 2008 par bovitch
Dadou Posté 7 Février 2008 Posté 7 Février 2008 Pour le aléatoire tu rajoutes ORDER BY Rand() SELECT `produits`.`id_produit`FROM `produits` , `categorie_produits` , `categories`WHERE `categorie_produits`.`id_produit` = `produits`.`id_produit` AND `categorie_produits`.`id_cat` = `categories`.`id_cat` AND `categories`.`id_parent` = '2'ORDER BY Rand()LIMIT 0 , 9 Pour la récursivité c'est plus chaud Mysql ne le supporte pas à l'heure actuelle
bovitch Posté 8 Février 2008 Auteur Posté 8 Février 2008 Pour la récursivité c'est plus chaud Mysql ne le supporte pas à l'heure actuelle oui sous Mysql c'est un casse tête alors que sous Oracle cette action semble très simple. Et en melant le PHP, ça ne rend pas la tâche plus facile ? c pas possible de faire une boucle en PHP : tant quil y a des sous catégorie .... (ça parait simple quand je l'ecris :-) ) En tout cas merci.
pluriels Posté 8 Février 2008 Posté 8 Février 2008 effectivement sous Oracle, tu peux parcourir ta base sous forme d'arbre. sinon, tu as pl-sql pour les traitements. Du côté de Mysql, ça n'existe pas encore. Par contre un assemblage PHP / Mysql est possible ça fait un super exercice d'algorithmie à mes BTS
Dadou Posté 8 Février 2008 Posté 8 Février 2008 Le problème c'est que potentiellement tu peux le faire via php, mais tu devras sortir de la base tous les résultats au lieu des 10 que tu a besoin, tu va donc alourdir le script
Dadou Posté 8 Février 2008 Posté 8 Février 2008 (modifié) 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 Modifié 8 Février 2008 par Dadou
pluriels Posté 8 Février 2008 Posté 8 Février 2008 (modifié) Tu ne peux pas créer un champs dans le quel tu enregistres tous les noeuds ? [edit]je retire, car ça n'indique toujours pas si un enfant n'a pas lui-même des enfants[/edit] La représentation intervallaire est séduisante, mais les opérations de mises à jour alourdissent le système. (il faut les traduire en PHP) La technique privilégie les accès en lecture (parcours de l'arbre). Comme dans certains index de BDD, il ne vaut pas mieux d'avoir des intervalles plus larges avec des espaces vides ? cela permet de ne modifier qu'une partie de l'arbre lors d'une insertion . mise à jour [edit]ça ne marche pas non plus, car dans ce cas, on n'a plus la possiblité d'avoir toutes les feuilles d'un coup[/edit] Modifié 8 Février 2008 par pluriels
smile Posté 8 Février 2008 Posté 8 Février 2008 (modifié) Tu peux le faire en deux étapes : function rand_cat($id) { $sql="SELECT id,parent_cat 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']); // recursif } } //depart mentionne parent_catrand_cat($depart); Voilà le principe maintenant il y'a d'autres façon pour y'arriver Modifié 8 Février 2008 par smile
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant