Bonjour,
J'ai une base avec des produits et des catégories de produits. Un produit peut appartenir à X catégories de produits en même temps.
Je cherche à récupérer la liste des produits qui possèdent toutes les catégories recherchées par le visiteur. Sous MySQL, il y a pas de intersect alors j'ai trouvé une solution en faisant une sous requête, par exemple pour 2 catégories, ça donne ça:
Ca fonctionne. Le pb, c'est que si je le fais sur la vraie base (j'ai simplifié les tables pour l'exemple), la requête met 10 secondes à s'exécuter sur le serveur, c'est hyper long.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 SELECT products.ID, products.title FROM products LEFT JOIN categories ct ON products.ID = ct.product_id WHERE ct.category_id = 41 AND products.ID IN ( SELECT products.ID FROM products LEFT JOIN categories ct ON products.ID = ct.product_id WHERE ct.category_id = 66 ) GROUP BY products.ID
J'ai pensé à une solution qui serait de simplement faire un OR sur les catégories, ce qui me renverrait toutes les entrées contenant l'une ou l'autre de ces catégories sans être groupées. Et ensuite de filtrer en PHP la liste pour récupérer uniquement les entrées ayant les 2 catégories.
Je passe à coté d'un truc ? Je suis pas très bon en SQL donc toutes les réponses sont bienvenues
Merci pour vos retours.
Partager