sql >> Base de Datos >  >> RDS >> Mysql

Búsqueda de texto completo de MySQL en varias tablas con diferentes campos

Encontré este problema al crear una búsqueda en un sitio web con múltiples tipos de contenido (base de datos de películas). Quería que el usuario pudiera hacer una búsqueda y encontrar un nombre de actor, película o personaje.

En lugar de intentar obtener una declaración SQL grande, hice una coincidencia para cada tipo de contenido (título_película, trama_película, nombre_actor, nombre_personaje, etc.) y asigné la identificación de la fila, el tipo de contenido y la puntuación de la coincidencia. en una matriz multidimensional. Por lo general, limitaría cada tipo de contenido a las 50 mejores coincidencias.

Luego pude ordenar la matriz según la puntuación. Luego usaría la identificación y el tipo de contenido para buscar la información que necesitaba para cada resultado.

EDITAR (agregar código)

Descargo de responsabilidad:este es un código antiguo y probablemente haya formas más eficientes de hacerlo

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