sql >> データベース >  >> RDS >> Mysql

異なるフィールドを持つ複数のテーブルでのMySQL全文検索

    複数の種類のコンテンツを含むWebサイト(映画データベース)で検索を構築するときに、この問題に遭遇しました。ユーザーが1回の検索で俳優、映画、またはキャラクターの名前を見つけられるようにしたかったのです。

    1つの大きなSQLステートメントを取得しようとする代わりに、コンテンツのタイプ(movie_title、movie_plot、actor_name、character_nameなど)ごとに一致を実行し、行のID、コンテンツのタイプ、および一致のスコアを固定しました。多次元配列に。私は通常、各コンテンツタイプを上位50件の一致に制限します。

    その後、スコアに基づいて配列を並べ替えることができました。次に、IDとコンテンツタイプを使用して、各結果に必要な情報を検索します。

    編集(コードの追加)

    免責事項:これは古いコードであり、おそらくより効率的な方法があります

    $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. SQLite JSON_GROUP_ARRAY()

    2. MySQLで連続したgroupbyを実行するにはどうすればよいですか?

    3. Postgresはサーバーに接続できませんでした

    4. MySQLは、不足している時間/日付を範囲内で埋める方法を教えてください。