Filtrer par plusieurs catégories (relation Many to Many)

a marqué ce sujet comme résolu.

Bonjour.

SVP, j’ai besoin d’aide pour finir une requête SQL.

Je veux laisser la possibilité aux visiteurs d’un site E-commerce de pouvoir filtrer les produits qui sont en vente par plusieurs catégories (avec des cases à cocher).

J’ai 3 tables :

_products (contient les produits qui sont en vente).

_productscategories (contient les catégories de produits).

_product_productcategory (est la table pivot pour faire la relation entre les 2 tables précédentes. A comme colonnes : "product_id" et "productcategory_id").

Pour filtrer les produits par une seule catégorie, je sais faire. ça donne ceci comme requête SQL à faire :

1
2
3
4
5
6
7
SELECT products.*
FROM `products`
INNER JOIN `product_productcategory`
    ON `products`.`id` = `product_productcategory`.`product_id`
INNER JOIN `productscategories`
    ON `productscategories`.`id` = `product_productcategory`.`productcategory_id` 
WHERE `productscategories`.`slug` = 'slug-category-filter'

Mais pour filtrer par plusieurs catégories (que les produits soient joints à toute les catégories cochées), je ne sais pas faire.

Quelqu’un pourrai m’aider SVP ?

(On m’avais dit il y a longtemps qu’on pouvais y faire avec GROUP BY et HAVING, mais je ne m’en rapelle plus trop).

Merci d’avance.

+0 -0

Bonjour,

Tu peux faire quelque chose de ce type :) (cf dernière ligne) A noter que si tu n’as rien de coché, il vaut mieux changer voire ne pas faire la requête selon le résultat que tu souhaites avoir dans ton application.

1
2
3
4
5
6
7
8
SELECT products.*
FROM `products`
INNER JOIN `product_productcategory`
    ON `products`.`id` = `product_productcategory`.`product_id`
INNER JOIN `productscategories`
    ON `productscategories`.`id` = `product_productcategory`.`productcategory_id` 
WHERE `productscategories`.`slug` = 'slug-category-filter'
AND `productscategories`.`id` IN (mettre des identifiants séparés par des virgules entre parenthèse ici)
+0 -0

Merci pour ta réponse. Si aucun catégorie n’est coché, je n’exécute pas cette requête SQL (j’en exécute une autre qui ne fait que récupérer les produits).

La requête SQL que tu me donne ne répond pas à ma problématique (je me suis peut être mal exprimé lors de mon 1er post).

Par exemple, si on coche 2 catégories : je ne souhaite pas récupérer les produits qui sont soit joint à l’une ou soit joint à l’autre catégorie. Mais je veut récupérer les produits qui sont joints au 2 catégories cochées.

Merci.

+0 -0

Tu peux multiplier les filtres en mettant des http://sql.sh/cours/where/exists, mais je n’ai aucune idée du résultat en performance.

Ensuite, en utilisant les fonctions d’aggrégations, il y a la possibilité de compter le nombre de catégories pour les produits que tu veux parmi celles que tu demandes et vérifier que ça correspond au nombre que tu en demandes, mais ça te demande encore une fois de compter pour chaque produit.

Je ne vois pas comment faire avec HAVING sans ça malheureusement, mes connaissances étant limités là dedans :/

EDIT: ma première idée (enlevée) était totalement fausse

+0 -0

J’essaierais ça:

1
2
3
4
5
6
7
select p.*, count(*) as category_count
from products_categories j
inner join products p on p.id=j.product_id
inner join categories c on c.id=j.category_id
where c.id in (...)
group by p.id
having category_count = N

AVec N le nombre de catégories listées dans le in.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte