Optimisation d'une requête

WRInaute discret
Bonjour à tous,

Voilà mon problème, j'ai mis en place une sorte d'annuaire.

Chaque élément peut se trouver dans un maximum de 10 catégories, category_id1, category_id2, category
_id3... ainsi de suite sont donc des champs dans la table qui regroupe mes éléments.

J'ai aussi une table regroupants toutes les catégories avec une hiérarchie à un niveau mère/fille.

Sur la page d'affichage d'un catégorie, je cherche tous les éléments qui se trouvent dans cette catégorie ou qui ont des filles dans cette catégorie.

Ca donne quelquechose comme :

Code:
OR (category_id2 = 49 OR
category_id2 IN (SELECT category_id FROM category WHERE par_category_id = 49))       
              OR (category_id3 = 49 OR
category_id3 IN (SELECT category_id FROM category WHERE par_category_id = 49))

 OR (category_id4 = 49 OR
 category_id4 IN (SELECT category_id FROM category WHERE par_category_id = 49))

Et ainsi de suite pour categor_id5,6,7,8,9....

Cette requête fonctionne bien mais cette page étant de plus en plus demandée, mon hébergeur a tiré un peu la sonette d'alarme en me demandant d'optimiser ma requête.

C'est là que j'ai besoin de vous, toute idée est la bienvenue...[/code]
 
WRInaute accro
bidulemachin a dit:
Chaque élément peut se trouver dans un maximum de 10 catégories, category_id1, category_id2, category
_id3... ainsi de suite sont donc des champs dans la table qui regroupe mes éléments.

Tu devrais avoir une autre table pour faire le lien entre les éléments et les catégories: (id_element,id_category). Ca a l'avantage que tu peux ensuite avoir autant de catégories que tu veux, et surtout ça simplifie pas mal les choses, il suffit de faire une jointure pour savoir si un élément est dans une catégorie: select * from elements e,liens l where l.id_element=e.id and l.id_category = ?

Jacques.
 
Nouveau WRInaute
Salut, je n'ai pas trouvé d'équivalent du "connect by" de oracle pour mysql, tu peux aller voir sur un forum qui en parle si sa ressemble à ton cas :

http://www.developpez.net/forums/showthread.php?t=51796&page=1

Si ton problème se pose sur le nombre de demande sur cette requête je pense que le mieux est de changer ta requête.

Tu peut aussi essayer d'améliorer ton modele puisque, dix éléments c'est déjà pas mal. Peut être faire une relation, R(ID_ELEMENT, ID_CAT) avec ID_ELEMENT et ID_CAT en clé primaire(couple)/étrangère.

De toute façon tu peut faire mieux sur la requête sa c'est sûr.
 
WRInaute discret
même avis que jcaron
et la requete aura comme condition un IN
exemple
Code:
SELECT mon_champ FROM t1,t2 WHERE t1.id=t2.id AND t2.id IN (1,53,12)

en gros, il faut que tu revois ta structure de base de données
lorsque l'on a tout un tas de valeurs qui reviennent, le plus efficace est de faire des tables de données uniques et une table qui les relient
 
Discussions similaires
Haut