Formulaire de recherche sur 3 tables

Eléphanteau du PHP | 37 Messages

25 mai 2008, 13:00

Bonjour à tous,

J'ai une base de données mysql 4.1.
Ma base est composée d'une table dossiers qui comporte le champ id_dossier,puis 2 tables de correspondance: dos_art et dos_the.

dos_art est composé de 2 champs: id_dossier et id_article.

dos_the est composé de 2 champs: id_dossier et id_thematique.

Chaque dossier peut avoir plusieurs articles et chaque dossier peut avoir plusieurs thématiques.
J'ai un formulaire de recherche sur lequel je peux entrer 3 thématiques et cocher n articles.

Je vois comment faire lorsqu'il y a un article et une thématique à rechercher, mais lorsqu'il y en a plusieurs je ne sais pas comment faire.

Merci pour votre aide.

Eléphant du PHP | 174 Messages

25 mai 2008, 14:08

Bonjour.

Bon j'ai peur de ne pas tout avoir saisi, donc faudra faire avec ;)

Si ton but est de faire une recherche multi-critères, une bonne chose aurait été de fouiller sur le forum, il y a beaucoup de sujet qui en parle.
A défaut je prend le temps de réexpliquer.

Ton formulaire propose trois champs thématiques et un nombre n d'articles.

Lorsque tu le valides, tu dois écrire une requête qui - si j'ai bien compris - recherche parmi les les dossiers, ceux qui possèdent une des trois thématiques précisées parmi les articles sélectionnés.

Je te conseille de procéder comme il suit :
<?php

//récupération (dans un tableau) de la liste des id_article correspondants
//aux articles cochés

//récupération des thématiques recherchées.

//A : récupération de la liste des id_dossier de la table dos_art
//où les id_article correspondent à ceux des articles cochés

//B : récupération de la liste des id_dossier de la table dos_them
//où les id_thematique correspondant à ceux des thématiques recherchées

//C : récupération des données des dossiers où id_dossier appartient à la liste obtenue
//en A et en B (utilisation de la clause IN de SQL)

?>
Il est aussi possible de faire le travail en une seule requête (par jointure des tables) libre à toi de le faire ou pas.

En espérant t'avoir dépanné un peu.

Bonne progra !
"Il vaut mieux avoir du luxe dans ses sentiments que sur ses habits, je ne crains, moi, le mépris de personne" Honoré De Balzac.
"On s'étonne trop de ce que l'on voit rarement et trop peu de ce que l'on voit chaque jour" Mme de Genlis
"L'absence diminue les médiocres passions et augmente les grandes comme le vent éteint les bougies et allume le feu" La RocheFoucauld
"People have hope because they can't see Death standing behind them" (anonymous)
"Of all the things I've lost, I miss my brain the most" (from a fanfic)

Eléphanteau du PHP | 37 Messages

25 mai 2008, 15:17

Merci animithra pour ce début de réponse malgré le fait que mon exposé ne soit pas très clair 8-)

Mais en fait, ca se complique dès la phase A de ton code : comment récupérer de la liste des id_dossier de la table dos_art où les id_article correspondent à ceux des articles cochés ?

Ex:
Voici ma table :
ID_DOSSIER ID_ARTICLE
1 6
1 7
1 8
1 9
1 10
1 11
1 12
1 13
2 1
2 2
2 3
2 4
2 5

Admettons que l'utilisateur ait coché les articles 1 et 2, quelle sera ma requête ?
J'ai essayé SELECT * FROM `dos_the`WHERE `ID_ARTICLE`=1 AND `ID_ARTICLE`=2 mais cela ne retourne évidemment aucun résultat...

Pour la jointure des tables, je ne connais pas mais je vais me renseigner.

Merci encore

Eléphant du PHP | 174 Messages

25 mai 2008, 16:14

Mais en fait, ca se complique dès la phase A de ton code : comment récupérer de la liste des id_dossier de la table dos_art où les id_article correspondent à ceux des articles cochés ?
La réponse semble tout bêtement être dans ce que tu as énoncé au départ :
Ma base est composée d'une table dossiers qui comporte le champ id_dossier,puis 2 tables de correspondance: dos_art et dos_the.

dos_art est composé de 2 champs: id_dossier et id_article.
tu peux donc faire :

Code : Tout sélectionner

requeteA = SELECT id_dossier FROM dos_art WHERE id_article = idrécupéré
et pas
J'ai essayé SELECT * FROM `dos_the`WHERE `ID_ARTICLE`=1 AND `ID_ARTICLE`=2 mais cela ne retourne évidemment aucun résultat...
avec dos_the qui n'est pas logique ici.

Après tu fais de même pour les thématiques (requête B) puis pour la C :

Code : Tout sélectionner

SELECT * FROM dossier WHERE id_dossier IN (A) AND id_dossier IN (B)
Bonne progra !
"Il vaut mieux avoir du luxe dans ses sentiments que sur ses habits, je ne crains, moi, le mépris de personne" Honoré De Balzac.
"On s'étonne trop de ce que l'on voit rarement et trop peu de ce que l'on voit chaque jour" Mme de Genlis
"L'absence diminue les médiocres passions et augmente les grandes comme le vent éteint les bougies et allume le feu" La RocheFoucauld
"People have hope because they can't see Death standing behind them" (anonymous)
"Of all the things I've lost, I miss my brain the most" (from a fanfic)

Eléphanteau du PHP | 37 Messages

25 mai 2008, 17:02

Ok super ca marche.

Il suffit de faire autant de fois A qu'il y a d'articles cochés et idem pour les thématiques.
Ce qui donne une requête de ce style au final :

Code : Tout sélectionner

SELECT * FROM dossier WHERE id_dossier IN (SELECT id_dossier FROM dos_art WHERE id_article = '3') AND id_dossier IN (SELECT id_dossier FROM dos_the WHERE id_thematique = 6) AND id_dossier IN (SELECT id_dossier FROM dos_art WHERE id_article = '4') AND ...
Merci beaucoup pour ton aide

caribou91