Bonjour à tous, je vous expose mon problème.
Je développe pour mes études un site de e-commerce, et je dois coder un filtre de produits.
Tout fonctionnerait parfaitement si INTERSECT était implémenté dans mysql...
Malheureusement, la vie étant cruelle, ce n'est pas le cas et je me retrouve avec une requête qui ne marche pas dès qu'il y a plusieurs critères de filtrage.
Le problème est que la requête est construite dynamiquement, et que pour des raisons de récursivité des catégories de produits, ma requête est assez complexe : voici la fonction de construction.
Ce qui donne dans le cas d'un filtre à 2 critères :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 public function CatalogueParFiltre($id, $filtres) { //Construction de la requête //On insère la requête principale sélectionnant les produits de la catégorie $ligne = "SELECT DISTINCT idproduit, description, idcategorie, image, prix FROM produit WHERE (idcategorie='".$id."' OR idcategorie IN (SELECT idcategorie FROM categorie WHERE categorie.idcategoriesup='".$id."')) AND (idproduit IN("; //On insère une sous requête sélectionnant les produits en fonction des caractéristiques filtrées par l'utilisateur foreach($filtres as $cle => $valeur) { $_SESSION['filtres'][$cle] = $valeur; if(empty($sous_ligne)) { $sous_ligne = "SELECT idproduit from caracteristique WHERE idtypecaracteristique='".$cle."' AND valeur='".$valeur."' "; } else { //!IMPORTANT Laisser l'espace (caractère vide) avant 'INTERSECT' dans la ligne de code ci-dessous $sous_ligne = $sous_ligne." INTERSECT SELECT idproduit from caracteristique WHERE idtypecaracteristique='".$cle."' AND valeur='".$valeur."' "; } } //Fermeture de la sous-requête $ligne = $ligne.$sous_ligne."))"; print_r($ligne);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT DISTINCT idproduit, description, idcategorie, image, prix FROM produit WHERE (idcategorie='1' OR idcategorie IN (SELECT idcategorie FROM categorie WHERE categorie.idcategoriesup='1')) AND (idproduit IN(SELECT idproduit from caracteristique WHERE idtypecaracteristique='1' AND valeur='900' INTERSECT SELECT idproduit from caracteristique WHERE idtypecaracteristique='3' AND valeur='DDR2-SDRAM' ))
Bien entendu, ça ne marche pas, j'utilise UNION à la place d' INTERSECT à des fins de test du site, mais j'aimerais que ce satané filtre fonctionne...
J'ai parcouru plusieurs fois ce forum à la recherche d'équivalences pour INTERSECT, mais, ma compréhension d'SQL a ses limites et je ne parviens pas à construire ma requête différemment sans que la syntaxe soit fausse...
Pourriez-vous m'indiquer quelques pistes pour que cette requête fonctionne enfin?
Partager