0

こんにちは、検索機能に統合された選択クエリがあります。次のコードがあります。

foreach ($keywords as $key=>$keyword){
$where .= "`column_a` LIKE '%$keyword%'";
$where .= " OR ";
$where .= "`column_b` LIKE '%$keyword%'";
$where .= " OR ";   
$where .= "`column_c` LIKE '%$keyword%'";
$where .= " OR ";
$where .= "`column_d` LIKE '%$keyword%'";
$where .= " OR ";
$where .= "`column_e` LIKE '%$keyword%'";

    if ($key != ($total_keywords - 1)){ 
        $where .= " AND ";
    }
}

$results = "SELECT `column_a`, `column_b`, `column_c`, `column_d`, `column_e` FROM `table` WHERE $where";

キーワードを 1 つだけ検索する場合、クエリは次のようになります。

SELECT `column_a`, `column_b`, `column_c`, `column_d`, `column_e` FROM `table` WHERE `column_a` LIKE '%one%' OR `column_b` LIKE '%one%' OR `column_c` LIKE '%one%' OR `column_d` LIKE '%one%' OR `column_e` LIKE '%one%'

かなり長いものです。2 つの検索語がある場合は、次のようになります。

SELECT `column_a`, `column_b`, `column_c`, column_d`, `column_e` FROM `table` WHERE `column_a` LIKE '%one%' OR `column_b` LIKE '%one%' OR `column_c` LIKE '%one%' OR `column_d` LIKE '%one%' OR `column_e` LIKE '%one%' AND `column_a` LIKE '%two%' OR `column_b` LIKE '%two%' OR `column_c` LIKE '%two%' OR `column_d` LIKE '%two%' OR `column_e` `LIKE` '%two%'

明らかに長すぎるもの。私の質問は、同じ結果を得る別の方法はありますか? MATCH() AGAINST() があることは既に知っていますが、これは不明な理由で機能していません。

私を助けてくれる人がいれば、本当に感謝しています。どうもありがとう。

4

1 に答える 1

0

この答えをチェックしてください。

クエリが短縮され、最大5つの条件で常に十分です。

それ以上に、すべての列を1つに結合して、その中で検索することができます。

SELECT `column_a`, `column_b`, `column_c`, column_d`, `column_e` FROM `table` 
WHERE CONCAT(column_a, column_b, column_c, column_d, column_e) REGEXP 'one|two'

ただし、フルテキストインデックス(ある場合)は、このクエリでは機能しない可能性があります。パフォーマンスが適切かどうかを確認します。

于 2012-04-22T22:24:56.813 に答える