PB résultat Requête SQL avec jointure 3 tables

Nouveau WRInaute
Bonjour à tous,

Voila mon Souci, j'ai 3 tables :

produits
id | ref ...
2 | AA
2 | BB
3 | CC
4 | DD


produits_filtres
produits_id | filtres_id
2 | 9
2 | 11
3 | 11
4 | 12

filtres
id | NameFiltre | ValueFiltre
8 | Themes | Plage
9 | Themes | Ville
10 | Motifs | Rayures
11 | Motifs | Zèbre
12 | style | Rock

J'ai une requête qui me permets de lister tous les filtres utilisé par les produits :
SELECT F.* FROM `filtres` F

JOIN `produits_filtres` PF
ON `PF`.`filtres_id` = `F`.id

JOIN `produits` P
ON `P`.id = `PF`.`produits_id`

GROUP BY `F`.`id`


Résultat :
9 Themes Ville
11 Motifs Zèbre
12 style Rock


Mais je n'arrive pas à lister les filtres qu'utilisent les produits dont un filtre est déjà utilisé ex :

Si ma requête cible les produits dont PF.filtres_id = 9,
j'aimerais que la liste des filtres utilisé par PF.produits_id, et qui ont PF.filtres_id = 9

Résultat souhaité :
9 Themes Ville
11 Motifs Zèbre

j'ai testé avec une sous requête : WHERE `P`.`id` IN (SELECT `P`.`id` FROM `produits` PF WHERE `PF`.`filtres_id` = 9 )
Mais non...

en espérant avoir été assez explicite.

Merci de votre aide,

Franck
 
WRInaute occasionnel
Bonjour,

Je ne connais pas votre niveau en sql mais si vous êtes débutant, il vaut peut-être mieux utiliser les jointures avec des "where" que les "join" qui joignent à droite ou à gauche suivant les configurations....

Selon les extraits de tables donnés, je ne vois pas comment le résultat souhaité pourrait sortir. Si on ne choisi qui 9 comme id_produit, il est normal que seuls les produits correspondants soient retournés par la requête.
Une petite clarification est sans doute nécessaire pour pouvoir aider de manière plus efficace.
 
Nouveau WRInaute
pas facile je sais...

en fait

si ds la Table "produits_filtres "
filtres_id = 9
donc
produits_id = 2

Mais d'autred 2 ds la colonne produits_id correspondant à d'autres filtres_id

c'est l'ensemble de ces filtres que je souhaite lister pour avoir ce résultat :
9 Themes Ville (car 9 est bien de la colonne produits_filtres = filtres.id )
11 Motifs Zèbre (et il ont comme valeur commune produits_id = 2 ou relation ds la mm Table)

Merci
 
WRInaute occasionnel
Personnellement, je diviserais en deux requêtes et je ne suis pas sûr de pouvoir aider sur une requête de cette complexité. S'il n'y a qu'un id_produit, tu peux utiliser "having" mais dans d'autres cas, je ne vois pas trop, faudrait que je m'y penche vraiment dessus !
 
WRInaute discret
Bonjour.

Sauf erreur, cette requête renvoie ce que tu cherches :

Code:
select id, nameFiltre, ValueFiltre from filtres where id in (select filtres_id from produits_filtres  group by  filtres_id, produits_id   having produits_id in (select produits_id from produits_filtres where filtres_id=9))

Bonne fin d'am.

@++
 
WRInaute accro
@Supermaury : je n'ai pas la solution au problème mais une chose est sur c'est que la requête que tu indique bouffe énormement en ressources

il y a tous les ingrédients qui font exploser les serveurs (in, requêtes imbriqués, group by et having)
:wink:
 
WRInaute discret
Bonjour Noren.

C'est clair que je ne me suis pas posé là question de charge. J'ai juste cherché à faire la requête en une seule instruction comme demandé :D

Après, s'il fait ça en plusieurs requêtes successives dans son code PHP, ça ne doit pas être bien compliqué.

@++!
 
Nouveau WRInaute
je vais tester les 2 versions par curiosité,

Mais de toute façon le résultat sera mis en cache.
 
Nouveau WRInaute
Comment le feriez vous en 2 requêtes ? je nage complet pour le coup

je reprend ma jointure initiale et refait une requête sur le résultat ?


Merci
 
Nouveau WRInaute
Ok trouvé !

pour ceux qui veulent :

1ere requete :
Code:
SELECT * FROM `produits_filtres` where 
produits_id = (select produits_id from produits_filtres where filtres_id=9)
GROUP BY `produits_filtres`.`filtres_id`


2eme requete après mise en tableau des resultats :
Code:
SELECT * FROM filtres WHERE id in(9,11)
 
Discussions similaires
Haut