sql >> Database teknologi >  >> RDS >> Mysql

MySQL fuldtekstsøgning på flere tabeller med forskellige felter

Jeg stødte på dette problem ved at bygge en søgning på et websted med flere typer indhold (filmdatabase). Jeg ønskede, at brugeren skulle kunne foretage én søgning og finde et skuespiller-, film- eller karakternavn.

I stedet for at forsøge at få én stor SQL-sætning, lavede jeg et match for hver type indhold (filmtitel, filmplot, skuespillernavn, karakternavn osv.) og fastlagde rækkens id, indholdstypen og kampens score. ind i en multidimensionel række. Jeg ville normalt begrænse hver indholdstype til de 50 bedste resultater.

Jeg var derefter i stand til at sortere arrayet baseret på score. Så ville jeg bruge id'et og indholdstypen til at slå de oplysninger op, jeg havde brug for for hvert resultat.

EDIT (tilføj kode)

Ansvarsfraskrivelse:Dette er gammel kode, og der er sandsynligvis mere effektive måder at gøre 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. Sådan finder du dublerede poster i Access

  2. MySQL - Sletning af nogle specifikke tabeller fra Big Database

  3. Optimer django-forespørgsel for at trække udenlandsk nøgle og django-taggit-forhold

  4. 12 almindeligt anvendte SQL-operatører