partendo dal presupposto che hai una sola tabella con tutti i campi dove ricercare come varchar, io farei così:
1 i campi varchar della tabella dove vuoi fare le ricerche li convertirei, tramite phpmyadmin, in fulltext (il pulsantino "T" nella colonna delle azioni), la tabella aumenta di dimensione ma velocizzi la query
2 il form homt di ricerca dovrebbe avere un solo campo input dove poter scrivere quello che si vuole come ad esempio "farmacista a bologna"
3 php che gestisce la stringa
Codice PHP:
//questa funzione pulisce la stringa dalle stringhe di lunghezza minore di 4
function filtro($val){
if(strlen(trim($val))<4){
return false;
} else {
return true;
}
}
// in questa riga di codice faccio molte cose:
// esplodo la stringa di ricerca explode(" ", $_POST['espressione'])
// filtro l'array risultante tramite la funzione filtro array_filter(..., "filtro")
// elimino gli elementi duplicati dall'array array_unique()
// ricreo una stringa implode()
// il risultato finale con una ricerca "farmacista a bologna" è "*farmacista* *bologna*"
$espressione = "*".implode("* *", (array_unique(array_filter(explode(" ", $_POST['espressione']), "filtro"))))."*";
// l'sql da usare nella query
// "SELECT MATCH .... AGAINST(.... IN BOOLEAN MODE) AS attinenza" ti permette di ottenere i risultati creando un "punteggio" per attinenze milgiori, tramite php puoi anche mostrare il "punteggio" dell'attinenza
// "WHERE MATCH .... AGAINST(.... IN BOOLEAN MODE)" la vera condizione
// "ORDER BY attinenza" per ordinare dalla migliore alla peggiore attinenza
$sql = "SELECT *, MATCH( campo1, campo2) AGAINST('".$espressione."' IN BOOLEAN MODE) AS attinenza FROM tabella WHERE MATCH(campo1, campo2) AGAINST('".$espressione."' IN BOOLEAN MODE) ORDER BY attinenza DESC LIMIT 0,20";
per approfondire http://www.html.it/articoli/un-motor...php-e-mysql-1/