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

複数のキーワード検索

    $rows キーワードcodeのデータが含まれます テーブル内の一致は、両方のキーワードに一致するようにコードを書き直すことができます

    $keyword = 'hello code';
    $exloded = explode(' ', $keyword);
    $query = 'SELECT * FROM A ';
    $i = 0;
    $params = array();
    foreach ($exploded as $value):
        if ($i == 0) {
            $query .= ' WHERE `text` LIKE :value_'.$i;
        } else {
            $query .= ' OR `text` LIKE :value_'.$i;
        }
        $params[':value_'.$i] = '%'.$value .'%';
        $i++;
    endforeach;
    $sth = $db->query($query);
    $sth->execute($params);
    $rows = $sth->fetchAll();
    echo '<pre>';print_r($rows);echo '</pre>';
    
    ';

    ループ内で(指定されたキーワードに対して)クエリを作成し、クエリ内で一意のプレースホルダーを割り当てて、すべての値に一致させます

    全文検索用に編集

    全文検索を使用すると、提供されたキーワードとまったく同じフレーズを照合できます。全文検索を使用するには、タイプFULLTEXTのインデックスが必要です。 。

    ALTER TABLE `A` ADD FULLTEXT INDEX `fulltextindex` (`text`); 
    

    クエリは

    のようになります
    $keyword = 'hello code';
    $exloded = explode(' ', $keyword);
    $where = '';
    $i = 0;
    $select = array();
    $params = array();
    
    foreach ($exploded as $value):
        $select[]= ' MATCH(`text`) AGAINST(:value_'.$i.' IN BOOLEAN MODE) ';
        if ($i == 0) {
            $where  .= ' WHERE MATCH(`text`) AGAINST(:value_'.$i.' IN BOOLEAN MODE)';
        } else {
            $where  .= ' OR MATCH(`text`) AGAINST(:value_'.$i.' IN BOOLEAN MODE)';
        }
        $params[':value_'.$i] =  $value ;
        $i++;
    endforeach;
    
    $query ='SELECT *,'. implode( ' + ',$select).' AS score FROM A '.$where.' ORDER BY score DESC';
    $sth = $db->query($query);
    $sth->execute($params);
    $rows = $sth->fetchAll();
    echo '<pre>';print_r($rows);echo '</pre>';
    
    ';

    上記のコードは

    のようなクエリを生成します
    SELECT *,
    MATCH(`text`) AGAINST('hello' IN BOOLEAN MODE)
    + 
    MATCH(`text`) AGAINST('code' IN BOOLEAN MODE) AS score
    FROM A 
    WHERE MATCH(`text`) AGAINST('hello' IN BOOLEAN MODE)
    OR  MATCH(`text`) AGAINST('code' IN BOOLEAN MODE)
    ORDER BY score DESC
    

    エイリアスscore 上記のクエリでは、各行の値とそれに一致するスコアが含まれるため、結果を降順で並べ替えて、スコアが最も高いレコードを最初に表示できます。



    1. HTMLフォームスライダー

    2. プロアクティブなSQLServerヘルスチェック、パート3:インスタンスとデータベースの設定

    3. MySQLで現在の日付と時刻を取得する方法

    4. MySQLNOTINクエリ