IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Requête complexe dynamique (INTERSECT inside)


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 8
    Points : 8
    Points
    8
    Par défaut Requête complexe dynamique (INTERSECT inside)
    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.

    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);
    Ce qui donne dans le cas d'un filtre à 2 critères :

    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?

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton, je lis ici :http://blog.developpez.com/ylarvor?t...eur_ensemblis1
    INTERSECT renvoie le même résultat qu'un INNER JOIN.
    Seule l'écriture de la requête est différente.
    INTERSECT renvoie chaque valeur distinct présente à la fois à droite de l'opérateur et à gauche de l'opérateur.
    Je conclus de la deuxième assertion que c'est plutôt effectivement là le comportement par défaut de UNION sous MySQL qui n'a pas grand chose à voir avec INNER JOIN.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    Saluton, je lis ici :http://blog.developpez.com/ylarvor?t...eur_ensemblis1
    Je conclus de la deuxième assertion que c'est plutôt effectivement là le comportement par défaut de UNION sous MySQL qui n'a pas grand chose à voir avec INNER JOIN.
    Je ne suis pas sur de comprendre votre réponse. Voulez-vous dire que ma requête est adaptée seulement à l'opérateur UNION?

    Quelles modifications apporter alors pour que INNER JOIN fasse l'affaire?

    PS: Mes tentatives de contournement m'ont amené à écrire ceci pour éviter le IN qui semble-t-il n'est pas optimisé, mais je ne parviens toujours pas à filtrer mes produits sur plusieurs critères :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT DISTINCT prod.idproduit, prod.description, prod.idcategorie, prod.image, prod.prix 
    FROM produit AS prod 
    JOIN categorie AS cat ON prod.idcategorie=cat.idcategorie
    JOIN categorie AS cat2 ON cat.idcategorie=cat2.idcategorie
    JOIN produit AS prod2 ON prod.idproduit=prod2.idproduit
    JOIN caracteristique AS caract ON prod.idproduit=caract.idproduit
    JOIN typecaracteristique AS TypeC ON caract.idtypecaracteristique=TypeC.idtypecaracteristique
    WHERE cat.idcategorie=1 OR cat2.idcategoriesup=1
    Suis-je sur la bonne voie?

Discussions similaires

  1. Requête complexe (recursive inside)
    Par Harry Callahan dans le forum Développement
    Réponses: 1
    Dernier message: 18/04/2011, 08h03
  2. Requête complexe
    Par Yali dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/01/2005, 09h19
  3. 3 tables avec requête complexe
    Par yamino dans le forum Langage SQL
    Réponses: 6
    Dernier message: 25/03/2004, 19h50
  4. Encore une requête complexe sur plusieurs tables
    Par DenPro dans le forum Langage SQL
    Réponses: 5
    Dernier message: 09/12/2003, 19h05
  5. Requête complexe sur plusieurs table
    Par DenPro dans le forum Langage SQL
    Réponses: 13
    Dernier message: 25/11/2003, 17h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo