Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wyszukiwanie pełnotekstowe MySQL w wielu tabelach z różnymi polami

Natknąłem się na ten problem budując wyszukiwanie na stronie internetowej z wieloma rodzajami treści (baza filmów). Chciałem, aby użytkownik mógł przeprowadzić jedno wyszukiwanie i znaleźć aktora, film lub imię postaci.

Zamiast próbować uzyskać jedną dużą instrukcję SQL, zrobiłem dopasowanie dla każdego rodzaju treści (tytuł_filmu, fabuła_filmu, nazwa_aktora, nazwa_postaci itp.) i utknąłem identyfikator wiersza, typ treści i wynik dopasowania w wielowymiarową tablicę. Zazwyczaj ograniczyłbym każdy typ treści do 50 najlepszych dopasowań.

Byłem wtedy w stanie posortować tablicę na podstawie wyniku. Następnie użyłbym identyfikatora i typu treści, aby wyszukać informacje potrzebne dla każdego wyniku.

EDYCJA (dodawanie kodu)

Zastrzeżenie:to jest stary kod i prawdopodobnie są na to bardziej efektywne sposoby

$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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyszukaj tablicę postów w wartości kolumny oddzielonej przecinkami

  2. Optymalizacja czasu pobierania MySQL

  3. Zapakuj niektóre dane wejściowe z polem wyboru i wyślij do bazy danych

  4. Nie można utworzyć wystąpienia Multi-AZ Aurora RDS

  5. Mysql - znajdź rozmowę, która jest prowadzona tylko przez dwóch użytkowników