Page 1 sur 1

Formulaire de recherche sur 3 tables

Posté : 25 mai 2008, 13:00
par caribou91
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.

Posté : 25 mai 2008, 14:08
par animithra
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 !

Posté : 25 mai 2008, 15:17
par caribou91
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

Posté : 25 mai 2008, 16:14
par animithra
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 !

Posté : 25 mai 2008, 17:02
par caribou91
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