2

だから私は自分のデータベース検索の結果を表示したいDBとWebページを持っています

どちらも機能するいくつかの方法を試しましたが、達成したいことには不完全です

テーブル列 id,Id_Nombre,Pais,Estado,Ciudad,website のすべてを、検索テキストから 1 つまたは複数の単語で検索できるようにしたいと考えています。

このコードは機能しますが、大文字と小文字が区別される単語を正確に入力する必要があります。

$query = "SELECT * FROM Medios_table WHERE concat(id,Id_Nombre,Pais,Estado,Ciudad,website) LIKE '%$Busqueda%'";

その結果、検索ボックスに「人」のような単語を入力し、データベースでその単語を「人」としてそれらの列のいずれかに入力しても見つかりません。

私が使用する2番目のコードは機能しますが、1つの列のみを使用します

$query = "SELECT * FROM Medios_table WHERE UPPER(Id_Nombre) LIKE UPPER('%$Busqueda%')";

このコードの結果は、使用されている大文字と小文字に関係なく検出されるため、優れていますが、このタイプの検索を他のすべての列に拡張する必要がありますが、これまでのところ、使用するものはすべて機能しません。

私が試してみました:

 $query = "SELECT * FROM Medios_table WHERE UPPER(id,Id_Nombre,Pais,Estado,Ciudad,website) LIKE UPPER('%$Busqueda%')";

  $query = "SELECT * FROM Medios_table WHERE UPPER(concat(id,Id_Nombre,Pais,Estado,Ciudad,website)) LIKE UPPER('%$Busqueda%')";

  $query = "SELECT * FROM Medios_table WHERE concat(UPPER(id,Id_Nombre,Pais,Estado,Ciudad,website)) LIKE UPPER('%$Busqueda%')";

など、どんな助けでも大歓迎です、ありがとう。

4

3 に答える 3

4

UPPER各列名を試してみましたか?このような:

$query = "SELECT * FROM Medios_table WHERE concat(UPPER(id),UPPER(Id_Nombre),UPPER(Pais),UPPER(Estado),UPPER(Ciudad),UPPER(website)) LIKE UPPER('%$Busqueda%')";
于 2012-10-22T20:19:24.310 に答える
1

upper(concat(...)) バージョンが機能するはずです。これで問題が発生した場合は、括弧か何かを省略したなどの単なるタイプミスである可能性があります。

upper はパラメーターを 1 つしかとらないため、upper(x,y,z) とは言えません。最初に concat を実行してから、upper、すなわち upper(concat(x,y,z)) を実行する必要があります。

とはいえ、このクエリは大規模なデータベースでは非常に遅くなります。これは、db エンジンがテーブル内のすべてのレコードを読み取ってから、各レコードを文字単位で検索する必要があるためです。テーブルが小さい場合、またはこれが頻繁に行われない場合は、許容される可能性があります。テーブルが大きい場合、および/またはこのクエリが頻繁に実行される場合は、まったく異なるアプローチが必要です。

アップデート

フィールド内のテキストに対して検索する必要があり、検索対象のテキストや検索対象のテキストについて事前に推測できない場合は、全文検索を検討する必要があります。http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html

この種の検索を常に行う場合は、辞書を作成することをお勧めします。つまり、その単語が出現するすべてのレコードを含むすべての単語のリストを作成します。これが基本的にフルテキストの機能だと思います。これにより、何かが得られる場合と得られない場合があります。

ただし、ある程度の予知がある場合、つまり、任意のテキストのどこかにある任意のテキストを検索したくない場合は、検索したいものを別々のフィールドに分割するよりも.

簡単な例を挙げると、「Fred Smith」、「Mary Jones」など、顧客の氏名を含むフィールドがあるとします。姓で誰かを検索したいとします。あなたは検索することができます

where full_name like '%Smith%'

ただし、これには、テーブル内のすべてのレコードを読み取る必要があります。代わりに、フィールドを名と姓に分割した場合は、次のように検索できます。

where last_name='Smith'

last_name にインデックスがある場合、これは非常に高速な検索になります。

いくつかのフィールドのいずれかに入力された値を探しているだけの場合は、はるかに高速です。

where estado='Toledo' or ciudad='Toledo' or pais='Toledo'

(estado、ciudad、および pais にインデックスがあると仮定して)、

where concat(estado, ciudad, pais) like '%Toledo%'

(インデックスが役に立たない場合)。

大文字と小文字を区別しない検索を行う場合は、estado ではなく、upper(estado) にインデックスを作成するなどしてください。そうすれば、「where upper(estado)='TOLEDO'」でインデックスを使用できます。

また、MySql についてはわかりませんが、LIKE がワイルドカードで始まらない場合、一部のデータベース エンジンはインデックスを使用できます。つまり、「'%x%' のようなフィールド」は、テーブル内のすべてのレコードを読み取る必要があります。しかし、一部のデータベースでは、「'x%' のようなフィールド」は can インデックスを使用して、フィールドが「x」で始まるレコードを取得し、それらを処理することができます。

于 2012-10-22T20:23:16.640 に答える
0

全文検索が必要です

このリンクは、Mysqlの全文検索に役立つ場合があります

于 2012-10-22T20:19:02.080 に答える