Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Volltextsuche in mehreren Tabellen mit unterschiedlichen Feldern

Ich bin auf dieses Problem gestoßen, als ich eine Suche auf einer Website mit mehreren Arten von Inhalten (Filmdatenbank) erstellte. Ich wollte, dass der Benutzer in der Lage ist, eine Suche durchzuführen und den Namen eines Schauspielers, Films oder Charakters zu finden.

Anstatt zu versuchen, eine große SQL-Anweisung zu erhalten, habe ich eine Übereinstimmung für jeden Inhaltstyp (Filmtitel, Filmhandlung, Schauspielername, Charaktername usw.) durchgeführt und die ID der Zeile, den Inhaltstyp und die Punktzahl der Übereinstimmung festgehalten in ein mehrdimensionales Array. Normalerweise würde ich jeden Inhaltstyp auf die 50 besten Übereinstimmungen beschränken.

Ich war dann in der Lage, das Array basierend auf der Punktzahl zu sortieren. Dann würde ich die ID und den Inhaltstyp verwenden, um die Informationen nachzuschlagen, die ich für jedes Ergebnis benötige.

BEARBEITEN (Code hinzufügen)

Haftungsausschluss:Dies ist alter Code, und es gibt wahrscheinlich effizientere Möglichkeiten, dies zu tun

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