sql >> Databasteknik >  >> RDS >> Mysql

MySQL fulltextsökning på flera tabeller med olika fält

Jag stötte på det här problemet med att skapa en sökning på en webbplats med flera typer av innehåll (filmdatabas). Jag ville att användaren skulle kunna göra en sökning och hitta en skådespelare, film eller karaktärsnamn.

Istället för att försöka få en stor SQL-sats, gjorde jag en matchning för varje typ av innehåll (filmtitel, filmplot, skådespelarens_namn, karaktärsnamn, etc.) och fastnade radens id, typen av innehåll och poängen för matchen till en flerdimensionell array. Jag skulle vanligtvis begränsa varje innehållstyp till de 50 bästa matchningarna.

Jag kunde sedan sortera arrayen baserat på poäng. Sedan skulle jag använda id och innehållstyp för att leta upp den information jag behövde för varje resultat.

EDIT (lägger till kod)

Friskrivningsklausul:Det här är gammal kod, och det finns förmodligen mer effektiva sätt att göra det på

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



  1. Hur får jag ett antal associerade rader i en vänsterkoppling i MySQL?

  2. Avgöra om fältdata i Oracle är av nummertyp

  3. Mysql startproblem | FEL! Servern avslutades utan att uppdatera PID-filen

  4. MySQL:hur konverterar man till EAV?