Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Pesquisa de texto completo do MySQL em várias tabelas com campos diferentes


Me deparei com esse problema ao criar uma pesquisa em um site com vários tipos de conteúdo (banco de dados de filmes). Eu queria que o usuário pudesse fazer uma pesquisa e encontrar um ator, filme ou nome de personagem.

Em vez de tentar obter uma grande instrução SQL, fiz uma correspondência para cada tipo de conteúdo (movie_title, movie_plot, actor_name, character_name, etc.) e colei o id da linha, o tipo de conteúdo e a pontuação da correspondência em uma matriz multidimensional. Eu normalmente limitaria cada tipo de conteúdo às 50 principais correspondências.

Consegui então classificar a matriz com base na pontuação. Em seguida, eu usaria o id e o tipo de conteúdo para procurar as informações necessárias para cada resultado.

EDITAR (adicionando código)

Isenção de responsabilidade:Este é um código antigo e provavelmente há maneiras mais eficientes de fazê-lo
$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++;
        }
}