MATCH / AGAINST sur plusieurs tables

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : MATCH / AGAINST sur plusieurs tables

par Devether » 02 mai 2007, 16:55

bon, je suis en train de tester plusieurs choses donc je ne vais pas tout mettre ici.
neanmoins voici la partie du schema qui nous concerne.

Code : Tout sélectionner

+---------------------------------+ | applications | +---------------------------------+ | app_id | app_nom | +---------+-----------------------+ | 1 | logiciel 1 | | 2 | logiciel 2 | | 3 | logiciel 3 | +------------------------------------------+ | problemes | +------------------------------------------+ | prob_id | prob_titre | app_id | +---------+-----------------------+--------+ | 1 | exemple de probleme | 1 | | 2 | exemple2 de probleme | 2 | | 3 | exemple3 de probleme | 1 | +-----------------------------------------+ | solutions | +-----------------------------------------+ | sol_id | sol_desc | prob_id | +---------+---------------------+---------+ | 1 | soluce1 du prob1 | 1 | | 2 | soluce1 du prob2 | 2 | | 3 | soluce2 du prob1 | 1 |
donc si on suit le schéma ici on a une application qui s'appelle "logiciel 1"

pour laquelle on a deux problèmes référencés "exemple de probleme" et "exemple3 de probleme"

et pour "exemple de probleme" on a deux solutions "soluce1 du prob1" et "soluce2 du prob1"

Ma recheche dois porter sur l'ensemble des champs "app_nom", "prob_titre" et "sol_desc".

Admettons que l'on recherche tous les problèmes qui concerne une application en particulier, et bien on entre simplement le nom de l'appli dans le champ de recherche et ça doit afficher tout ce qui contient ce mot en classant les résultats selon que le mot en question apparait dans 3, 2 ou un seul champ.

J'espère que c'est assez clair sinon dites le moi.

par Hubert Roksor » 30 avr. 2007, 18:26

Tout est possible, et tu auras probablement mieux fait d'effectuer le classement par MySQL. En revanche il faut nous expliquer en quoi tes tables sont liées, et surtout comment (par une colonne commune ?).

Un extrait du schéma de ta base permettrait peut-être de se faire une idée.

par Devether » 30 avr. 2007, 17:03

Merci pour ta réponse.

Néanmoins, même si faire 3 requêtes est plus simple pour la recherche, j'ai essayé de faire un classement par pertinence mais je n'arrive pas a faire en sorte que les score s'additionnent si les mots sont contenu a la fois dans le nom de l'application , le titre du probleme et la description de la solution.

il me faudrait un traitement php assez lourd je pense donc j'aimerais savoir s'il est possible de la faire directement dans la requete.
Mais s'il n'y a que ça pour résoudre mon problème alors j'irais poster dans la partie PHP du forum.

Re: MATCH / AGAINST sur plusieurs tables

par Hubert Roksor » 27 avr. 2007, 19:22

Le problème c'est que si tu ne précises pas de relation entre les 3 tables alors ton serveur va en faire le "produit cartésien". Autrement dit, si chacune des tables contient 50 enregistrements tu te retrouves avec 125 000 combinaisons à examiner.

Si tu veux récupérer les données des 3 tables il te faut donc effectuer 3 requêtes, ce qui résoud ton problème au passage. Il n'est pas possible de créer un index sur des tables différentes.

MATCH / AGAINST sur plusieurs tables

par Devether » 27 avr. 2007, 16:43

Bonjour,

Je voudrais avoir des détails sur l'utilisation de MATCH / AGAINST pour une recherche en FULLTEXT.

Mon schéma contient 3 tables : applications, problemes, solutions

Je voudrais faire un moteur de recherche qui vérifierait aussi bien le nom des applications, les intitulés des problèmes et le contenu des solutions.

en gros j'ai essayé de faire ça dans un premier temps :

Code : Tout sélectionner

SELECT p.*, a.*, g.* FROM applications AS a, problemes AS p, solutions AS a WHERE MATCH (a.app_nom, p.prob_titre, s.sol_desc) AGAINST ('erreur 82');
Le probleme c'est que je me suis rendu compte en faisant des recherches que le contenu de MATCH() doit être identique a l'index qui a été créé.

mais j'ai bien vu que ceci ne fonctionnait pas.

Code : Tout sélectionner

ALTER TABLE applications AS a, problemes AS p, solutions AS a ADD FULLTEXT(a.app_nom, p.prob_titre, s.sol_desc);
Donc voila ma question : comment faire une recherche en FULLTEXT sur plusieurs tables ou comment créer un index qui regrouperait 3 champs de tables différentes?

Merci d'avance
.