現在、次のコードを使用して複数の列を検索する単一の検索フィールドがあります。
$searchArray = explode(" ", $searchVal);
$query="SELECT * FROM users WHERE ";
$i=0;
foreach ($searchArray as $word) {
if ($i != 0) $query .= " OR ";
$query .= " MATCH (`first_name`, `last_name`, `email`) AGAINST ('".$word."*' IN BOOLEAN MODE)";
$i++;
}
テーブルに次の2つの行があるとします。
id | last_name | first_name | email
1 | Smith | John | john_smith@js.com
2 | Smith | Bob | bob_smith@js.com
「JohnS」と入力すると、最初の結果だけが望ましい動作を示します。
「JohnSmith」と入力すると、最初の結果だけが望ましい動作を示します。
「SmithJ」と入力すると、Bobが一致していなくても、両方の結果が表示されます。
「SmithJohn」と入力すると、Bobが一致していなくても、両方の結果が表示されます。
最後に、「Jo S」と入力すると、「Jo」と「S」が部分的に一致しても結果は返されません。
誰かが私のクエリを修正して、重要ではなく部分的な結果の一致である注文の目的の機能を処理するのを手伝ってもらえますか?最適な一致で並べ替えることができれば(つまり、単語の最も長い部分で、最初の文字から始まり、中央のセクションだけでなく、列の数が最も多い)、それも大きな助けになります。
アップデート:
ソリューションに基づいて機能する最終的なコードを投稿したかっただけです。ft_min_word_lenと同様に、複数の一致ステートメントを作成するループが正しくありませんでした。
私のコードは次のとおりです。
$searchArray = explode(" ", $searchVal);
$query="SELECT * FROM users WHERE MATCH (`first_name`, `last_name`, `email`) AGAINST ('";
$i=0;
foreach ($searchArray as $word) {
$query .= "+".$word."* ";
}
$query .= "' IN BOOLEAN MODE)";