図書館のユーザーが高度な検索を行えるようにフォームを作成したいと考えています。フォームにハードコードされた値を使用してクエリに追加できると思いました (選択フィールドから取得されます)。また、可能な限り最小限のコードでこれを行う方法も考えたので、誰かが (単語) を選択した場合 (つまり、フレーズではなく単語を検索する場合) に備えて爆発を実行します。私の最終的なコードは次のようになります。
<?php
/**
* this variable is the result of the user
* selecting 'word' or 'phrase'
**/
$coleccion = implode('&', $keysres);
$contents_1 = array();
$contents_2 = array();
$contents_3 = array();
$words_1 = array();
$words_2 = array();
$words_3 = array();
switch ($coleccion) {
case 'palabras&palabras&palabras':
$contents_1 = preg_split('/[\s,]+/', $buscar_1);
foreach ($contents_1 as $word) {
array_push($words_1, " MATCH ($contenido_1) AGAINST ('$word') ");
}
$contents_2 = preg_split('/[\s,]+/', $buscar_2);
foreach ($contents_2 as $word) {
array_push($words_2, " MATCH ($contenido_2) AGAINST ('$word') ");
}
$contents_3 = preg_split('/[\s,]+/', $buscar_3);
foreach ($contents_3 as $word) {
array_push($words_3, " MATCH ($contenido_3) AGAINST ('$word') ");
}
$search_words_1 = implode(" OR ", $words_1);
$search_words_2 = implode(" OR ", $words_2);
$search_words_3 = implode(" OR ", $words_3);
$consulta = "
SELECT *
FROM catalogo
WHERE
$search_words_1 ".
$oper_1
." $search_words_2 ".
$oper_2 ."
$search_words_3 ";
break;
?>
問題は、選択フィールドの値を変更すると、誰かが AND の代わりに OR 演算を実行することを選択し、2 番目のテキスト フィールドに対してフレーズ検索を実行することを選択したとします。そのような場合、表示されません。検索が制限または拡大されています。たとえば、次のケースで変数ダンプを$coleccion=palabras&frase&palabras
実行し、クエリの var_dump を実行すると、次のように表示されます。SELECT * FROM catalogo WHERE MATCH (titulo) AGAINST ('mesones') OR MATCH (titulo) AGAINST ('y') OR MATCH (titulo) AGAINST ('bariones') OR MATCH(titulo) AGAINST('mesones y totems') AND MATCH (titulo) AGAINST ('bariones')
だから私の質問は、SQLで検索を制限/拡大する正しい方法は何ですか? 残念ながら、データベースにはテストするエントリがあまりありません。
最後に、一部のレコードを「除く」すべてのレコードを取得しようとするクエリが次の構文になるように設定しました。
SELECT * FROM catalogo WHERE MATCH (titulo) AGAINST ('comunicaciones') OR MATCH (titulo) AGAINST ('y') OR MATCH (titulo) AGAINST ('poder') AND NOT MATCH(titulo) AGAINST('mesones') AND NOT MATCH (titulo) AGAINST ('bariones')
しかし、そのようなクエリは指定されたレコードを本当に除外するのでしょうか。または、これによると、BOOLEAN モードで先頭のマイナスを使用する必要があります。
先頭のマイナス記号は、この単語が返される行のいずれにも存在してはならないことを示します。注: - 演算子は、他の検索語と一致する行を除外するためだけに機能します。したがって、前に - が付いている用語のみを含むブール モードの検索では、空の結果が返されます。「除外された用語を含む行を除くすべての行」は返されません。
私は今、私が疑っていることについての例を持っていると思います. 次のクエリがあるとします。
SELECT * FROM catalogo WHERE MATCH (titulo) AGAINST ('comunicaciones') OR MATCH (titulo) AGAINST ('y') OR MATCH (titulo) AGAINST ('poder') AND MATCH (titulo) AGAINST ('mesones') OR MATCH (titulo) AGAINST ('y') OR MATCH (titulo) AGAINST ('totems') AND NOT MATCH(titulo) AGAINST('bariones')
次に、「comunicaciones」、「y」、および「poder」という単語を含むすべてのレコードと、「mesones」、「y」、および「totems」という単語を含むすべてのレコードを表示する必要があると思いますが、「bariones」という単語を含むレコードは表示されません。 '。ただし、そのクエリの結果は、DB に comunicaciones という単語があるもののみです。