Mysql
 sql >> Database >  >> RDS >> Mysql

Ricerca fulltext MySQL su più tabelle con campi diversi

Mi sono imbattuto in questo problema costruendo una ricerca su un sito Web con più tipi di contenuto (database di film). Volevo che l'utente potesse effettuare una ricerca e trovare il nome di un attore, film o personaggio.

Invece di cercare di ottenere una grande istruzione SQL, ho eseguito una corrispondenza per ogni tipo di contenuto (titolo_film, trama_film, nome_attore, nome_personaggio, ecc.) e ho bloccato l'id della riga, il tipo di contenuto e il punteggio della corrispondenza in una matrice multidimensionale. Di solito limiterei ogni tipo di contenuto alle prime 50 corrispondenze.

Sono stato quindi in grado di ordinare l'array in base al punteggio. Quindi userei l'id e il tipo di contenuto per cercare le informazioni di cui avevo bisogno per ogni risultato.

EDIT (aggiungendo codice)

Dichiarazione di non responsabilità:questo è vecchio codice e probabilmente esistono modi più efficienti per farlo

$topResults = array();
$topResults[0] = array('nil', 'nil', 0);

$movieFound = 0;
$plotFound = 0;
$actorFound = 0;
$characterFound = 0;

// example of movie title... follow the same procedure for the others
$sql = "SELECT movies.Movie_ID as mid, MATCH (Movie_Title) AGAINST ('$searchstring') AS Score FROM movies, Rating_Movie_Relationships WHERE MATCH (Movie_Title) AGAINST ('$searchstring') AND Front_Image_File IS NOT NULL AND movies.Movie_ID = Rating_Movie_Relationships.Movie_ID $sqlwhere ORDER BY Score DESC LIMIT 0, 20";
$result = @mysql_query($sql);
while ($row = mysql_fetch_array($result)) {
    for ($i = 0; $i < count($topResults);$i++){
        if ($row['Score'] > $topResults[$i][2]){
            for ($j = count($topResults); $j > $i; $j--){
                $topResults[$j] = $topResults[$j-1];
            }
            $topResults[$i] = array($row['mid'], 'm', $row['Score'] - $movieWeight);
            break;
        }
    }
    $movieFound = 1;
}

//.... add the other content types here following the movie title example

for ($i = 0; $i < count($topResults); $i++){
    if ($topResults[$i][1] == 'm'){
        if ($countMovies < $limit) {
            $movieTitleDivText .= str_replace('\'','&#39;',createPersonMovieImageLink($topResults[$i][0]));
            $countMovies++;
        }
}