Mysql
 sql >> Base de données >  >> RDS >> Mysql

Recherche en texte intégral MySQL sur plusieurs tables avec différents champs

Je suis tombé sur ce problème en créant une recherche sur un site Web avec plusieurs types de contenu (base de données de films). Je voulais que l'utilisateur puisse effectuer une recherche et trouver un nom d'acteur, de film ou de personnage.

Au lieu d'essayer d'obtenir une grosse instruction SQL, j'ai fait une correspondance pour chaque type de contenu (movie_title, movie_plot, actor_name, character_name, etc.) et j'ai collé l'id de la ligne, le type de contenu et le score de la correspondance dans un tableau multidimensionnel. Je limiterais généralement chaque type de contenu aux 50 meilleures correspondances.

J'ai ensuite pu trier le tableau en fonction du score. Ensuite, j'utiliserais l'identifiant et le type de contenu pour rechercher les informations dont j'avais besoin pour chaque résultat.

EDIT (ajout de code)

Avis de non-responsabilité :il s'agit d'un ancien code, et il existe probablement des moyens plus efficaces de le faire

$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++;
        }
}