Page 1 sur 1

trouver plusieurs mots a l'aide d'une requete

Posté : 20 nov. 2007, 17:18
par béka
Bonjour,

je voudrais faire un petit moteur de recherche qui offre la possibilité à l'utilisateur de rechercher soit un mot soit tous les mots qu'il a saisi dans les différents enregitrements présents dans la BDD

Pour rechercher au moins un mot, c'est ok mais je ne vois pas comment faire ma requête sql pour rechercher tous les mots saisis par l'utilisateurs.
Le résultat qui doit etre retourné est le ou les enregistrments qui possèdent TOUS les mots saisis dans leurs différents champs.

Voici ce que j'ai fait, mais cela ne marche pas
// SI ON RECHERCHE TOUS LES MOTS
      if(isset($_GET['mots']) and $_GET['mots'] == 'tous'){
        $explode = explode(',', $_GET['keywords']);
        $mot ='';
        for($i=0; $i<count($explode); $i++) {
            $mot .= " ".$explode[$i];
            $sql = "select * from `table` where MATCH (champ1,champ2,champ3) AGAINST ('".$mot."') AND (`type` LIKE 'type')";
            
...
Comment faire une telle requête ?

Posté : 20 nov. 2007, 17:27
par Berzemus
Tu dois commencer par ajouter un champ fulltext..
petit lien

Posté : 20 nov. 2007, 17:29
par béka
oui oui mais ça c'est fait.
J'utilise déjà MATCH ... AGAINST pour trouver au moins un mot mais mon problème est trouver les enregistrements qui comprennent TOUS les mots saisis par l'utilisateur

Posté : 20 nov. 2007, 17:41
par Berzemus
Alors tu fais une recherche booléenne (petit lien) avec des petits + devant chaque mot.

Posté : 20 nov. 2007, 17:53
par béka
comment ça ?

[EDIT] : d'accord, j'avais pas vu le petit lien, j'ai compris, je vais lire ça.

Posté : 21 nov. 2007, 11:35
par béka
Ma version de MySQL n'est pas assez récente pour utiliser la méthode que tu me propose IN BOOLEAN MODE pourtant cetter equête

Code : Tout sélectionner

SELECT * FROM `table` WHERE MATCH (champ1,champ2,champ3) AGAINST ('transfer region');
va marcher.
Comment puis-je faire autrement ?

Posté : 21 nov. 2007, 14:27
par Berzemus
Pourtant elle devrait fonctionner depuis la 4.0.1 (qui est sortie depuis octobre 2004)

Si c'est possible, je dirais que faire une mise à jour serait la meilleure des options.

Mais pour la recherche full-text, dans ta version, je ne sais pas trop.. peut-être en multipliant les "AND":

Code : Tout sélectionner

SELECT * FROM `table` WHERE MATCH (champ1) AGAINST ('transfer region') AND MATCH (champ2) AGAINST ('transfer region') AND MATCH (champ3) AGAINST ('transfer region');

Posté : 21 nov. 2007, 15:04
par béka
en faisant comme tu me le propose cela va faire : rechercher le mot "transfer" ou le mot "region" dans le champs "champ1" ET rechercher le mot "transfer" ou le mot "region" dans le champs "champ2"...

or moi ce que je voudrais et que je n'arrive pas a faire, c'est rechercher les enregistrement qui contienne le mot "mot1" et le mot "mot2" dans les champs "champ1" ou "champ2"...

Posté : 21 nov. 2007, 17:32
par Berzemus
Ah.. ben c'est la qu'intervient la lecture critique, en considérant que oui, moi aussi je me trompe :oops:

Alors, dans le bon ordre:

Code : Tout sélectionner

SELECT * FROM `table` WHERE MATCH (champ1,champ2,champ3) AGAINST ('region') AND MATCH (champ1,champ2,champ3) AGAINST ('transfer');
Quelque chôse comme ça..

Posté : 21 nov. 2007, 18:09
par béka
oui effectivement c'est ce que j'ai fait... c'est en lisant la solution que tu m'avais proposé plus ma remarque que j'ai trouvé la solution que tu me propose. :D

Merci quand même.